Tôi có tập lệnh python thực thi trong thư mục "tập lệnh" và có liên kết tượng trưng cho tập lệnh đó (được sử dụng để khởi chạy tệp) trong thư mục gốc. Một cái gì đó như:Khởi chạy tập lệnh python qua liên kết tượng trưng
.
├── scripts
│ ├── const.py
│ ├── fops.py
│ ├── i_build.py
│ └── i_Props.ini
└── build_i -> scripts/i_build.py
Tôi muốn để có thể khởi động/chạy các kịch bản của tôi qua:
python build_i
Từ thư mục gốc. Tập lệnh i_build.py sẽ mở i_Props.ini và thực hiện một số phép thuật dựa trên những gì trong đó.
Vấn đề là khi tập lệnh i_build.py được khởi chạy qua liên kết tượng trưng trong thư mục gốc, tập lệnh i_build.py sẽ tìm trong thư mục gốc cho các tệp khác (không phải thư mục/scripts nơi i_build.py là được lưu trữ).
File i_build.py có đạo cụ vị trí tệp như:
PROP_FILE = "i_Props.ini"
và cố gắng để mở đó, và sau đó thất bại. Tôi không muốn hardcode một con đường vì lý do rõ ràng.
Thử nghiệm nhanh chóng thêm os.getcwd()
vào tệp chính xác nhận sự nghi ngờ của tôi rằng CWD là thư mục gốc và séc __file__
cho biết đó là liên kết tượng trưng ("build_i").
Có bất kỳ điều gì tôi có thể làm để sử dụng con trăn đích đến của biểu tượng như tên __file__
và CWD không?
Bạn có thể giám sát hệ thống tệp bằng cách sử dụng kqueue/bất cứ thứ gì chúng có trên các hệ điều hành khác. Điều cuối cùng sẽ đặt hai vị trí ngoài có thể là inode bắt đầu thực hiện. Không ai trong số đó được tiếp xúc rất rõ ràng mà không cần đào bới mặc dù .. Điều duy nhất tôi có thể nghĩ là một liên kết cứng thay vì liên kết mềm, nhưng tôi nghĩ rằng có thể có hiệu ứng ngược lại hoàn toàn. Có một vài thủ thuật vỏ bạn có thể làm, tôi tin rằng vỏ Z có một 'trước khi bạn chạy chương trình' móc có thể nuôi cwd thực sự của bạn để kịch bản như một arg? .. – synthesizerpatel
Đây không phải là xứng đáng với một câu trả lời vì vậy tôi ' m bình luận. Bạn có thể đọc liên kết tượng trưng bằng cách sử dụng 'os.readlink()' và chạy tập lệnh từ kết quả bằng 'subprocess.Popen()'. Một chút clunky nhưng không công việc như không có gì là hardcoded và nó không thêm phụ thuộc. – ThinkChaos
liên quan: [Làm thế nào để tôi có được đường dẫn của tệp hiện tại trong python?] (Http://stackoverflow.com/q/2632199/4279) – jfs