Tôi đang xây dựng một tập lệnh trợ giúp đơn giản cho công việc sẽ sao chép một vài tệp mẫu trong cơ sở mã của chúng tôi vào thư mục hiện tại. Tuy nhiên, tôi không có đường dẫn tuyệt đối đến thư mục nơi các mẫu được lưu trữ. Tôi có một đường dẫn tương đối từ tập lệnh nhưng khi tôi gọi tập lệnh thì nó xử lý nó như một đường dẫn liên quan đến thư mục làm việc hiện tại. Có cách nào để xác định rằng url tương đối này là từ vị trí của tập lệnh thay thế không? Trong tệp có tập lệnh, bạn muốn làm một cái gì đó như thế này:
Điều này sẽ cung cấp cho bạn đường dẫn tuyệt đối đến tệp bạn đang tìm kiếm. Lưu ý rằng nếu bạn đang sử dụng setuptools, có lẽ bạn nên sử dụng API tài nguyên gói thay vào đó. UPDATE: Tôi đang trả lời một nhận xét ở đây để tôi có thể dán một mẫu mã. :-)
Tôi
giả sử bạn có nghĩa là tập lệnh
Tuy nhiên, tôi biết rằng có một số quirks với
Tuy nhiên, điều này làm tăng một ngoại lệ trên máy Windows của tôi. bạn cần
Như đã
đề cập trong câu trả lời được chấp nhận
Tôi chỉ muốn thêm rằng
Nó phải là một cái gì đó như
Câu trả lời được chấp nhận có thể gây hiểu nhầm trong một số trường hợp, vui lòng tham khảo this link để biết chi tiết Hãy xem xét mã của tôi:
Xem sys.path Khi được khởi tạo khi khởi động chương trình, mục đầu tiên của danh sách này, đường dẫn [0], là thư mục chứa tập lệnh được sử dụng để gọi trình thông dịch Python. Sử dụng đường dẫn này làm thư mục gốc mà bạn áp dụng đường dẫn tương đối của bạn
Bây giờ là năm 2018 và Python đã phát triển thành Vì vậy, chúng tôi có 3 đường dẫn ở đây (có thể trùng lặp):
và vấn đề là: chúng tôi không có đường dẫn đầy đủ của Bây giờ chúng ta hãy giải quyết điều này với điều tuyệt vời
Trong tương lai, nó chỉ đơn giản như vậy. : D Hơn nữa, chúng tôi có thể chọn và kiểm tra và sao chép/di chuyển các tệp mẫu đó bằng
Thay vì sử dụng
như trong câu trả lời được chấp nhận, nó sẽ mạnh mẽ hơn để sử dụng:
bởi vì sử dụng __file__ sẽ trả về tệp mà mô-đun đã được tải, nếu nó được tải từ một tệp, vì vậy nếu tệp có tập lệnh được gọi từ nơi khác, thư mục được trả về sẽ không chính xác. Những câu trả lời này cung cấp thêm chi tiết: https://stackoverflow.com/a/31867043/554225 và https://stackoverflow.com/a/50502/554225 Mã này sẽ trả về đường dẫn tuyệt đối đến tập lệnh chính.
Điều này sẽ làm việc ngay cả trong một mô-đun. Xin chào, trước tiên bạn nên hiểu các hàm os.path.abspath (path) và os.path.relpath (path) Tóm lại os.path.abspath (đường dẫn) tạo một đường dẫn tương đối đến đường dẫn tuyệt đối. Và nếu đường dẫn được cung cấp chính nó là một đường dẫn tuyệt đối thì hàm trả về cùng một đường dẫn. tương tự os.path.relpath (đường dẫn) tạo một đường dẫn tuyệt đối đến đường dẫn tương đối. Và nếu đường dẫn được cung cấp chính nó là một đường dẫn tương đối thì hàm trả về cùng một đường dẫn. Ví dụ dưới đây có thể cho phép bạn hiểu đúng khái niệm trên: giả sử tôi có một tệp input_file_list.txt chứa danh sách các tệp đầu vào được xử lý bởi tập lệnh python của tôi. D:\conc\input1.dic D:\conc\input2.dic D:\Copyioconc\input_file_list.txt Nếu bạn thấy cấu trúc thư mục ở trên, input_file_list.txt có trong thư mục Copyofconc và các tệp được xử lý bởi tập lệnh python có trong conc thư mục Nhưng nội dung của tệp input_file_list.txt như dưới đây: ..\conc\input1.dic ..\conc\input2.dic Và tập lệnh python của tôi có mặt trong D : ổ đĩa. Và đường dẫn tương đối được cung cấp trong tệp input_file_list.txt có liên quan đến đường dẫn của input_file_list.txt tệp. Vì vậy, khi kịch bản python sẽ thực thi thư mục làm việc hiện tại (sử dụng os.getcwd () để lấy đường dẫn) Vì đường dẫn tương đối của tôi có liên quan đến input_file_list.txt, đó là "D:\Copyofconc", tôi phải thay đổi thư mục làm việc hiện tại thành "D:\Copyofconc ". Vì vậy, tôi phải sử dụng os.chdir ('D:\Copyofconc'), vì vậy thư mục làm việc hiện tại sẽ là "D:\Copyofconc". Bây giờ để lấy các tệp input1.dic và input2.dic, tôi sẽ đọc các dòng "..\conc\input1.dic" sau đó sẽ sử dụng lệnh input1_path = os.path.abspath ('..\conc\input1.dic') (để thay đổi đường dẫn tương đối thành đường dẫn tuyệt đối. Ở đây, thư mục làm việc hiện tại là "D:\Copyofconc", tệp ".\conc\input1.dic" sẽ được truy cập liên quan đến "D:\Copyofconc") vì vậy input1_path sẽ là "D:\conc\input1.dic" Một thay thế phù hợp với tôi:
Những gì làm việc cho tôi là sử dụng
|