2013-10-28 43 views
10

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?

+0

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

+0

Đâ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

+0

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

Trả lời

1

Chỉ cần một vài khả năng mùa xuân trong tâm trí:

  1. Trong thư mục gốc có một tập tin vỏ mà các cuộc gọi python của bạn script by đường dẫn rõ ràng.
  2. Thêm thư mục nằm trong đường dẫn của bạn.
  3. Cụ thể thêm các thư mục để sys.path
+0

Tùy chọn 1 có thể là công việc của tôi xung quanh ... 2 và 3 về bản chất hardcoding vẫn còn.Tôi cần phải tránh bất cứ điều gì có liên quan đến các bước bổ sung vì điều này được phân phối cho một số người, các env vars ít bị rối tung với tốt hơn. – Mike

+0

Trên linux nếu bạn thêm tập lệnh bash vào/etc hoặc/bin hoặc/usr/etc thì nó sẽ được thực thi mà không cần đưa ra đường dẫn. –

13

Bạn có thể sử dụng __file__, nhưng bạn phải mất một biện pháp phòng ngừa để có được con đường thực tế:

import os 
base_dir = os.path.dirname(os.path.realpath(__file__)) 

Sau đó tải các tập tin khác của bạn/nguồn lực tương đối tới base_dir:

some_subdir = 'my_subdir' 
some_file = 'my.ini' 

ini_path = os.path.join(base_dir, some_subdir, some_file) 
+1

['__file__' có thể được undefined] (http://stackoverflow.com/q/2632199/4279) bạn có thể [fallback trên' sys.argv [0] 'trong trường hợp này] (https://bitbucket.org/ pypy/pypy/src/a299cd0a893f/pypy/tool/autopath.py? tại = mặc định # cl-29) – jfs

Các vấn đề liên quan