Làm cách nào để tìm ra đường dẫn python của tôi bằng python?


350

Làm cách nào để tìm ra thư mục nào được liệt kê trong PYTHONPATHbiến hệ thống của tôi , từ trong tập lệnh Python (hoặc trình vỏ tương tác)?


24
Tôi không chắc bạn đang cố gắng làm gì, nhưng nếu bạn muốn biết thư mục nào được sử dụng để tìm kiếm các mô-đun đang được nhập, bạn không nên dựa vào PYTHONPATH. Sử dụng sys.pathcho điều đó.
Vanuan

Bằng thí nghiệm đơn giản, tôi thấy câu trả lời của Vanuan bên dưới (in sys.path) chỉ in PYTHONPATH. Điều này hoạt động sau khi chúng tôi thay đổi giá trị bằng cách sử dụng add_path (new_path) để thêm vào PYTHONPATH.
Chân Kim

6
Tiêu đề của bài này và cơ thể hỏi hai câu hỏi khác nhau. sys.pathlà "Danh sách các chuỗi chỉ định đường dẫn tìm kiếm cho các mô-đun" - docs.python.org/2/l Library / sys.html # sys.path . PYTHONPATH là một biến môi trường ảnh hưởng đến danh sách này. Theo bất kỳ định nghĩa hợp lý sys.pathlà "con đường trăn" của bạn.
spinkus

4
Đừng quên về python -m site.
Andrew McKinlay

Câu trả lời:


236

sys.pathcó thể bao gồm các mục không đặc biệt trong PYTHONPATHbiến môi trường của bạn . Để truy vấn biến trực tiếp, sử dụng:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

3
(hoặc, nói chung hơn là ... chia (os.sep)). Không thể hiểu tại sao bạn không có được tình yêu, Mark. Câu trả lời của bạn về mặt kỹ thuật chính xác hơn câu trả lời của Paul D Waite cho câu hỏi của anh ấy ????
mjv

5
os.sep không chính xác, xem stackoverflow.com/questions/1499019/
Mark Ransom

2
Và vấn đề với dải phân cách có lẽ là lý do tại sao tôi không có được tình yêu. Cảm ơn cho tôi đặt thẳng.
Đánh dấu tiền chuộc

11
Và nếu nhận được KeyError, điều đó có nghĩa là PYTHONPATH không được xác định trong hệ thống của tôi? Đó có phải là vấn đề không? Cảm ơn
glarrain

9
@glarrin, đúng - KeyError có nghĩa là PYTHONPATH không được xác định. Nó sẽ không thành vấn đề vì đã có đường dẫn mặc định được thiết lập, xem sys.path.
Đánh dấu tiền chuộc

600

Bạn có thể cũng muốn điều này:

import sys
print(sys.path)

Hoặc như một lớp lót từ thiết bị đầu cuối:

python -c "import sys; print('\n'.join(sys.path))"

Nên biết trước : Nếu bạn có nhiều phiên bản của Python cài đặt bạn nên sử dụng một lệnh tương ứng python2hoặc python3.


Tương tự. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Thứ tư, ngày 6 tháng 6 09:41:07 UTC 2007 i686 GNU / Linux ...
Sange

7
Đây là cách độc lập với nền tảng và môi trường để có được đường dẫn python của thời gian chạy hiện tại.
Dmitry Minkovsky

13
Câu trả lời này hữu ích hơn nhiều cho tình huống của tôi so với câu trả lời được chấp nhận. Tôi biết các biến môi trường của tôi là gì. Tôi cần biết nơi trăn quyết định chỉ ra ngoài biến môi trường của tôi.
Vortility

Đối với Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco

@mirceamironenco đã thay đổi
Vanuan

10

Dường như không thể chỉnh sửa câu trả lời khác. Có một lỗi nhỏ ở chỗ nó chỉ dành cho Windows. Giải pháp chung hơn là sử dụng os.sep như sau:

sys.path có thể bao gồm các mục không có trong biến môi trường PYTHONPATH của bạn. Để truy vấn biến trực tiếp, sử dụng:

import os
os.environ['PYTHONPATH'].split(os.pathsep)

6
Đối với người đọc trong tương lai: os.septrả về dấu phân cách thư mục cho hệ điều hành, vd /. Dấu phân cách được sử dụng trong đường dẫn Python là khác nhau và được trả về os.pathsepnhư thể hiện trong câu trả lời được chấp nhận.
Paul D. Chờ

3

PYTHONPATH là một biến môi trường có giá trị là danh sách các thư mục. Sau khi thiết lập, nó được Python sử dụng để tìm kiếm các mô-đun đã nhập, cùng với các tiêu chuẩn khác. và thư mục thư viện của bên thứ 3 được liệt kê trong "sys.path" của Python.

Như bất kỳ biến môi trường nào khác, bạn có thể xuất nó trong shell hoặc trong ~ / .bashrc, xem tại đây . Bạn có thể truy vấn os.envir ['PYTHONPATH'] để biết giá trị của nó trong Python như dưới đây:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

NẾU được định nghĩa trong shell là

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

THEN kết quả =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

Kết quả ELSE =>

PYTHONPATH is not defined

Để đặt PYTHONPATH thành nhiều đường dẫn, xem tại đây .

Lưu ý rằng người ta có thể thêm hoặc xóa đường dẫn tìm kiếm thông qua sys.path.insert (), del hoặc remove () trong thời gian chạy, nhưng KHÔNG thông qua os.envir []. Thí dụ:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

Tóm lại, PYTHONPATH là một cách chỉ định (các) đường dẫn tìm kiếm Python cho các mô-đun đã nhập trong sys.path. Bạn cũng có thể áp dụng các hoạt động danh sách trực tiếp cho sys.path mà không cần sự trợ giúp của PYTHONPATH.


0

Python cho tôi biết nó sống ở đâu khi nó đưa cho tôi một thông báo lỗi :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>

-1

Dùng cái này:

import sys
print(sys.executable)

Hoặc một dòng từ cmd:

python -c "import sys; print(sys.executable)"

1
Có vẻ như tác giả của câu hỏi đang yêu cầu danh sách các thư mục python không phải là đường dẫn đến thực thi python thực tế.
Serge Shubin
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.