2013-02-27 71 views
33

Mã của tôi là:bộ PYTHONPATH trước khi báo cáo nhập khẩu

import scriptlib.abc 
import scriptlib.xyz 

def foo(): 
    ... some operations 

nhưng scriptlib là trong một số thư mục khác, vì vậy tôi sẽ phải bao gồm thư mục đó trong môi trường biến "PYTHONPATH".

Liệu có cách nào, trong đó lần đầu tiên tôi có thể thêm các thư mục scriptlib trong môi trường biến "PYTHONPATH" trước khi tuyên bố nhập khẩu nhận được thực hiện như:

import sys 
sys.path.append('/mypath/scriptlib') 
import scriptlib.abc 
import scriptlib.xyz 

def foo(): 
    ... some operations 

Nếu vậy, là giá trị duy nhất cho rằng dấu nhắc lệnh hoặc là nó toàn cầu ?

Cảm ơn trước

+1

Bạn hãy thử nó? Mã đó chỉ hoạt động. Giá trị mới của 'sys.tuy nhiên đường dẫn 'tuy nhiên là cục bộ cho chương trình của bạn (biến' $ PYTHONPATH' chỉ đọc khi khởi động trình thông dịch để điền 'sys.path', nó không được viết lại môi trường). – filmor

+0

Có nó đang làm việc – DKG

Trả lời

34

này sẽ thêm một đường dẫn đến quá trình Python của bạn/Ví dụ (ví dụ: chạy thực thi). Đường dẫn sẽ không được sửa đổi cho bất kỳ quy trình Python nào khác. Một chương trình Python đang chạy sẽ không có đường dẫn sửa đổi, và nếu bạn thoát khỏi chương trình của bạn và chạy lại, đường dẫn sẽ không bao gồm những gì bạn đã thêm trước đó. Bạn đang làm gì nói chung là đúng.

set.py:

import sys 
sys.path.append("/tmp/TEST") 

loop.py

import sys 
import time 
while True: 
    print sys.path 
    time.sleep(1) 

chạy: python loop.py &

này sẽ chạy loop.py, kết nối với STDOUT của bạn, và nó sẽ tiếp tục chạy trong nền. Sau đó, bạn có thể chạy python set.py. Mỗi bộ có một bộ biến môi trường khác nhau. Quan sát rằng đầu ra từ loop.py không thay đổi vì set.py không thay đổi môi trường loop.py.

Một lưu ý về việc nhập khẩu

Python nhập khẩu năng động, giống như phần còn lại của ngôn ngữ. Không có liên kết tĩnh nào đang diễn ra. Quá trình nhập là một dòng thực thi, giống như sys.path.append....

+0

nhưng tôi không muốn đường dẫn trong mã của tôi. Tôi muốn mã của tôi được sạch sẽ và di động. là không có khái niệm về một "dự án python". (Nói cho Visual-studio-code hoặc cho Atom.io) ?! – pashute

+0

Có, tương đương với một "dự án" Python là VirtualEnv. VirtualEnvWrapper là một giao diện đẹp để sử dụng. Sự khác biệt giữa điều này và Visual Studio là đã có một môi trường Python toàn cục, và virtualenv chỉ làm cho một lớp ảo trên đầu trang. Có thể có các công cụ khác, tôi đã rời khỏi Python trong một vài năm. – Joe

5

Cũng được ghi chú trong tài liệu here.
Tới Python X.X/Lib và thêm những dòng này đến site.py đó,

import sys 
sys.path.append("yourpathstring") 

này thay đổi sys.path của bạn để trên mỗi tải, nó sẽ có giá trị trong nó ..

Như đã nêu here về site.py,

Mô-đun này được tự động nhập trong khi khởi tạo. Nhập mô-đun này sẽ nối thêm đường dẫn cụ thể cho trang web vào đường dẫn tìm kiếm mô-đun và thêm một vài nội trang.

Đối với các phương pháp khác có thể xảy ra thêm một số đường dẫn đến sys.path xem these docs

+0

nhưng điều này giống như đặt giá trị trong biến môi trường theo cách thủ công. Những gì tôi cần là để thay đổi đường dẫn của thư viện khá thường xuyên như nhận được đường dẫn scriptlib từ một tập tin và thiết lập nó trước khi sử dụng chúng. – DKG

+0

Không, giá trị này được thêm vào trong mỗi lần chạy 'python.exe' khi' site.py' được nạp tự động trong khi khởi tạo. Vì vậy, bạn không cần 'import sys sys.path.append ....' trong mỗi tệp. – pradyunsg

+1

xem xét một tình huống mà tôi có 2 bản sao của cùng một tập lệnh python. một tập lệnh muốn nhận thư viện từ C: \ testers \ scriptlib và các thư khác từ D: \ developer \ scriptlib. Trong trường hợp đó, site.py có thể quyết định chỉ định đường dẫn và cho ai. – DKG