Trong tập lệnh Python, làm cách nào để đặt PYTHONPATH?


115

Tôi biết cách đặt nó trong / etc / profile và trong các biến môi trường của tôi.

Nhưng nếu tôi muốn đặt nó trong một script thì sao? Nó có phải là hệ điều hành nhập khẩu, hệ thống? Tôi phải làm nó như thế nào?

Câu trả lời:


192

Bạn không đặt PYTHONPATH, bạn thêm mục vào sys.path. Đó là danh sách các thư mục nên được tìm kiếm cho các gói Python, vì vậy bạn có thể chỉ cần nối các thư mục của mình vào danh sách đó.

sys.path.append('/path/to/whatever')

Trên thực tế, sys.pathđược khởi tạo bằng cách tách giá trị của PYTHONPATHký tự phân cách đường dẫn ( :trên các hệ thống giống Linux, ;trên Windows).

Bạn cũng có thể thêm các thư mục bằng cách sử dụng site.addsitedirvà phương pháp đó cũng sẽ tính đến .pthcác tệp hiện có trong các thư mục bạn chuyển. (Đó sẽ không phải là trường hợp với các thư mục bạn chỉ định trong PYTHONPATH.)


11
Đã nhiều năm kể từ khi câu trả lời này được đăng, nhưng tôi vẫn muốn nói thêm rằng nếu bạn muốn đảm bảo rằng Python kiểm tra thư mục mới trước tất cả các thư mục khác khi nhập, bạn nên đặt thư mục mới trước trong danh sách, như trong sys.path.insert(0, '/path/to/whatever').
wecsam

39

Bạn có thể lấy và đặt các biến môi trường thông qua os.environ:

import os
user_home = os.environ["HOME"]

os.environ["PYTHONPATH"] = "..."

Nhưng vì trình thông dịch của bạn đã chạy, điều này sẽ không có tác dụng. Bạn tốt hơn nên sử dụng

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

là mảng mà bạn PYTHONPATHsẽ được chuyển đổi thành khi khởi động trình thông dịch.


18

Nếu bạn đặt sys.path.append('dir/to/path')mà không kiểm tra, nó đã được thêm vào, bạn có thể tạo một danh sách dài sys.path. Đối với điều đó, tôi khuyên bạn nên:

import sys
import os # if you want this directory

try:
    sys.path.index('/dir/path') # Or os.getcwd() for this directory
except ValueError:
    sys.path.append('/dir/path') # Or os.getcwd() for this directory

2
Đẹp. Rất Pythonic.
Đặt hàng một phần vào

1
Làm cách nào để làm trống PythonPath? Tôi không muốn nối thêm. Tôi muốn làm trống nó và đặt những gì tôi chỉ muốn vào bên trong. Có cách nào để làm việc này không?
Schütze

Bạn đã thử khởi tạo lại nó bằng cách gọi sys.path .__ init __ () chưa? Điều này sẽ làm trống đường dẫn python. Hi vọng điêu nay co ich.
Thayz

@ francisco-manuel-garca-botella Việc trả lời các câu hỏi cũ rất được hoan nghênh trên trang web này! Không có gì phải tiếc.
user7610

Tôi không đồng ý rằng đây là pythonic, và tôi đề nghị rằng đó không phải là một cách tiếp cận lập trình tốt. Việc xử lý ngoại lệ rất tốn kém khi ngoại lệ xảy ra, vì vậy bạn không muốn sử dụng nó để thay thế câu lệnh "if" trong trường hợp rất có thể bạn sẽ sử dụng câu lệnh khác. Một lời khuyên đơn giản nếu 'mypath' trong sys.path ... khác ... sẽ là lời khuyên của tôi.
markgalassi

6

PYTHONPATH kết thúc bằng sys.path mà bạn có thể sửa đổi trong thời gian chạy.

import sys
sys.path += ["whatever"]

Có lý do gì để thích câu trả lời này hơn câu trả lời từ @DavidZ không?
Dror

Nếu không có gì khác, nó ít dài dòng hơn.
tripleee

-1

bạn có thể đặt PYTHONPATH, bằng cách os.environ['PATHPYTHON']=/some/path, sau đó bạn cần gọi os.system('python')khởi động lại trình bao python để làm cho đường dẫn mới được thêm vào có hiệu quả.


1
os.system()không "khởi động lại trình bao python", nó bắt đầu một phiên bản Python tương tác mới. Khi bạn quay lại từ đó, bạn sẽ quay lại tập lệnh gọi.
tripleee

-2

Tôi linux cái này cũng hoạt động:

import sys
sys.path.extend(["/path/to/dotpy/file/"])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.