ในสคริปต์ Python ฉันจะตั้งค่า PYTHONPATH ได้อย่างไร


115

ฉันรู้วิธีตั้งค่าใน / etc / profile และในตัวแปรสภาพแวดล้อมของฉัน

แต่ถ้าฉันต้องการตั้งค่าระหว่างสคริปต์ล่ะ? มัน import os, sys หรือเปล่า? ฉันต้องทำอย่างไร?

คำตอบ:


192

คุณไม่ได้ตั้งคุณเพิ่มรายการPYTHONPATH sys.pathเป็นรายชื่อไดเรกทอรีที่ควรค้นหาสำหรับแพ็คเกจ Python ดังนั้นคุณสามารถต่อท้ายไดเรกทอรีของคุณเข้ากับรายการนั้นได้

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

ในความเป็นจริงsys.pathเริ่มต้นโดยการแยกค่าของPYTHONPATHบนอักขระตัวคั่นเส้นทาง ( :บนระบบที่คล้ายกับ Linux ;บน Windows)

คุณยังสามารถเพิ่มไดเร็กทอรีโดยใช้site.addsitedirและวิธีการนั้นจะคำนึงถึง.pthไฟล์ที่มีอยู่ภายในไดเร็กทอรีที่คุณส่งผ่าน (ซึ่งจะไม่เป็นเช่นนั้นกับไดเรกทอรีที่คุณระบุPYTHONPATH)


11
เป็นเวลาหลายปีแล้วที่มีการโพสต์คำตอบนี้ แต่ฉันยังคงต้องการเพิ่มว่าหากคุณต้องการให้แน่ใจว่า Python ตรวจสอบไดเรกทอรีใหม่ก่อนรายการอื่นทั้งหมดเมื่อนำเข้าคุณควรใส่ไดเรกทอรีใหม่เป็นอันดับแรกในรายการเนื่องจาก ในsys.path.insert(0, '/path/to/whatever').
wecsam

39

คุณสามารถรับและตั้งค่าตัวแปรสภาพแวดล้อมผ่านทางos.environ:

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

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

แต่เนื่องจากล่ามของคุณทำงานอยู่แล้วจะไม่มีผลใด ๆ คุณควรใช้

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

ซึ่งเป็นอาร์เรย์ที่คุณPYTHONPATHจะเปลี่ยนเป็นล่ามในการเริ่มต้น


18

หากคุณใส่sys.path.append('dir/to/path')โดยไม่ได้กาเครื่องหมายถูกเพิ่มเข้าไปแล้วคุณสามารถสร้างรายการยาวsys.pathๆ ได้ สำหรับสิ่งนั้นฉันขอแนะนำสิ่งนี้:

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
ดี Pythonic มาก
PartialOrder

1
ฉันจะล้าง PythonPath ได้อย่างไร ฉันไม่ต้องการต่อท้าย ฉันต้องการทำให้มันว่างเปล่าและใส่สิ่งที่ฉันต้องการเท่านั้นไว้ข้างใน มีวิธีทำไหม?
Schütze

คุณลองเริ่มต้นใหม่โดยเรียก sys.path .__ init __ () หรือไม่ นี่ควรว่างเส้นทาง python หวังว่านี่จะช่วยได้
Thayz

@ francisco-manuel-garca-botella ยินดีต้อนรับคำถามเก่า ๆ ในเว็บไซต์นี้! ไม่มีอะไรต้องเสียใจ
user7610

ฉันไม่เห็นด้วยว่านี่คือ pythonic และฉันขอแนะนำว่ามันไม่ใช่วิธีการเขียนโปรแกรมที่ดี การจัดการข้อยกเว้นมีราคาแพงมากเมื่อเกิดข้อยกเว้นดังนั้นคุณจึงไม่ต้องการใช้เพื่อแทนที่คำสั่ง "if" ซึ่งเป็นไปได้ค่อนข้างมากที่คุณจะใช้คำสั่งอื่น ง่ายๆถ้า 'mypath' ใน sys.path ... อื่น ... จะเป็นคำแนะนำของฉัน
markgalassi

6

PYTHONPATH ลงท้ายด้วยsys.pathซึ่งคุณสามารถแก้ไขได้ที่รันไทม์

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

มีเหตุผลที่จะชอบคำตอบนี้มากกว่าคำตอบจาก @DavidZ หรือไม่?
Dror

ถ้าไม่มีอะไรอื่นก็จะน้อยลง
tripleee

-1

คุณสามารถตั้งค่าPYTHONPATHโดยos.environ['PATHPYTHON']=/some/pathจากนั้นคุณต้องเรียกos.system('python')เพื่อรีสตาร์ท python shell เพื่อให้เส้นทางที่เพิ่มใหม่มีประสิทธิภาพ


1
os.system()ไม่ "รีสตาร์ท python shell" แต่จะเริ่มอินสแตนซ์ Python แบบโต้ตอบใหม่ เมื่อคุณกลับจากนั้นคุณจะกลับมาอยู่ในสคริปต์การโทร
tripleee

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