ฉันจะค้นหาเส้นทางของหลามโดยใช้ python ได้อย่างไร


352

ฉันจะทราบได้อย่างไรว่าไดเรกทอรีใดบ้างที่อยู่ในรายการPYTHONPATHตัวแปรของระบบจากภายในสคริปต์ Python (หรือเชลล์เชิงโต้ตอบ)


25
ฉันไม่แน่ใจว่าคุณกำลังพยายามทำอะไร แต่ถ้าคุณต้องการทราบว่าโฟลเดอร์ใดที่ใช้ในการค้นหาโมดูลที่กำลังนำเข้าคุณไม่ควรPYTHONPATHเชื่อถือ ใช้sys.pathสำหรับการที่
Vanuan

จากการทดลองอย่างง่ายฉันพบคำตอบของ Vanuan ด้านล่าง (การพิมพ์ sys.path) เพียงพิมพ์ PYTHONPATH ทำงานได้หลังจากที่เราเปลี่ยนค่าโดยใช้ add_path (new_path) ซึ่งเพิ่มไปยัง PYTHONPATH
Chan Kim

6
ชื่อของโพสต์นี้และเนื้อหาถามคำถามสองข้อที่แตกต่างกัน sys.pathคือ "รายการของสตริงที่ระบุเส้นทางการค้นหาสำหรับโมดูล A" - docs.python.org/2/library/sys.html#sys.path PYTHONPATH เป็นตัวแปรสภาพแวดล้อมที่มีผลต่อรายการนี้ โดยคำจำกัดความที่สมเหตุสมผลใด ๆsys.pathคือ "เส้นทางของหลาม"
spinkus

4
python -m siteอย่าลืมเกี่ยวกับ
Andrew McKinlay

คำตอบ:


237

sys.pathอาจรวมถึงรายการที่ไม่ได้อยู่ในPYTHONPATHตัวแปรสภาพแวดล้อมของคุณโดยเฉพาะ หากต้องการสอบถามตัวแปรโดยตรงให้ใช้:

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

3
(หรือเพิ่มเติมโดยทั่วไป ... แยก (os.sep)) ไม่สามารถเข้าใจได้ว่าทำไมคุณถึงไม่ได้รับความรักมาร์ค การตอบกลับของคุณนั้นแม่นยำกว่าทางเทคนิคมากกว่า Paul D Waite ที่ตอบคำถามของเขาเอง ????
mjv

5
os.sep ไม่ถูกต้องโปรดดูstackoverflow.com/questions/1499019/…
Mark Ransom

2
และปัญหาที่เกิดกับตัวคั่นอาจเป็นเพราะฉันไม่ได้รับความรัก ขอบคุณสำหรับการตั้งค่าฉันตรง
Mark Ransom

11
และถ้าได้รับ KeyError แสดงว่า PYTHONPATH ไม่ได้ถูกกำหนดในระบบของฉัน? นั่นเป็นปัญหาหรือไม่? ขอบคุณ
glarrain

9
@glarrin ถูกต้อง - KeyError หมายความว่า PYTHONPATH ไม่ได้ถูกกำหนดไว้ sys.pathมันจะไม่เป็นปัญหาเพราะมีเส้นทางเริ่มต้นแล้วตั้งค่าดู
Mark Ransom

602

คุณอาจต้องการสิ่งนี้:

import sys
print(sys.path)

หรือเป็นหนึ่งซับจาก terminal:

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

ข้อแม้ : หลายถ้าคุณมีรุ่นที่ติดตั้ง Python คุณควรใช้คำสั่งที่เกี่ยวข้องหรือpython2python3


เหมือนกัน. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP พุธ 6 มิถุนายน 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal

7
นี่เป็นวิธีที่ไม่ขึ้นกับแพลตฟอร์มและสภาพแวดล้อมในการรับเส้นทางหลามของรันไทม์ในปัจจุบัน
Dmitry Minkovsky

14
คำตอบนี้มีประโยชน์มากสำหรับสถานการณ์ของฉันมากกว่าคำตอบที่ยอมรับ ฉันรู้ว่าตัวแปรสภาพแวดล้อมของฉันคืออะไร ฉันจำเป็นต้องรู้ว่างูใหญ่ตัดสินใจชี้ไปที่ใดนอกจากตัวแปรสภาพแวดล้อมของฉัน
Vorticity

สำหรับ Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco

@mirceamironenco เปลี่ยนแล้ว
Vanuan

11

ดูเหมือนจะไม่สามารถแก้ไขคำตอบอื่น ๆ มีข้อผิดพลาดเล็กน้อยคือเป็น Windows เท่านั้น ทางออกทั่วไปมากขึ้นคือการใช้ os.sep ดังนี้

sys.path อาจรวมถึงรายการที่ไม่ได้อยู่ในตัวแปรสภาพแวดล้อม PYTHONPATH ของคุณโดยเฉพาะ หากต้องการสอบถามตัวแปรโดยตรงให้ใช้:

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

6
สำหรับผู้อ่านในอนาคต: ผลตอบแทนที่คั่นไดเรกทอรีสำหรับระบบปฏิบัติการเช่นos.sep /ตัวคั่นที่ใช้ในเส้นทาง Python นั้นแตกต่างกันและส่งคืนโดยos.pathsepตามที่แสดงในคำตอบที่ยอมรับ
Paul D. Waite

3

PYTHONPATH เป็นตัวแปรสภาพแวดล้อมที่มีค่าเป็นรายการของไดเรกทอรี เมื่อตั้งค่าแล้วมันถูกใช้โดย Python เพื่อค้นหาโมดูลที่อิมพอร์ตพร้อมกับ std อื่น และไดเรกทอรีห้องสมุดบุคคลที่สามที่อยู่ในรายการ "sys.path" ของ Python

ในฐานะที่เป็นตัวแปรสภาพแวดล้อมอื่น ๆ ที่คุณสามารถส่งออกไปในเปลือกหรือ ~ / .bashrc ดูที่นี่ คุณสามารถสืบค้น os.environ ['PYTHONPATH'] สำหรับค่าใน Python ดังแสดงด้านล่าง:

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

ถ้านิยามไว้ใน shell เป็น

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

ผลลัพธ์ =>

/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']

ผลอื่น =>

PYTHONPATH is not defined

หากต้องการตั้งค่า PYTHONPATH เป็นหลายเส้นทางดูที่นี่ที่นี่

โปรดทราบว่าสามารถเพิ่มหรือลบพา ธ การค้นหาผ่าน sys.path.insert (), del หรือ remove () ณ เวลาทำงาน แต่ไม่ผ่าน os.environ [] ตัวอย่าง:

>>> 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']
>>> 

โดยสรุป PYTHONPATH เป็นวิธีหนึ่งในการระบุ Python search path (s) สำหรับโมดูลที่อิมพอร์ตใน sys.path คุณยังสามารถใช้การดำเนินการรายการกับ sys.path โดยตรงโดยไม่ต้องใช้ PYTHONPATH


0

Python บอกฉันว่ามันอยู่ที่ไหนเมื่อมันทำให้ฉันเกิดข้อผิดพลาด :)

>>> 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'
>>>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.