เมื่อใดก็ตามที่ฉันใช้sys.path.append
ไดเรกทอรีใหม่จะถูกเพิ่ม อย่างไรก็ตามเมื่อฉันปิด python รายการจะเปลี่ยนกลับเป็นค่าก่อนหน้า (ค่าเริ่มต้นหรือไม่) ฉันจะเพิ่มไดเรกทอรีไปยังถาวรได้PYTHONPATH
อย่างไร
เมื่อใดก็ตามที่ฉันใช้sys.path.append
ไดเรกทอรีใหม่จะถูกเพิ่ม อย่างไรก็ตามเมื่อฉันปิด python รายการจะเปลี่ยนกลับเป็นค่าก่อนหน้า (ค่าเริ่มต้นหรือไม่) ฉันจะเพิ่มไดเรกทอรีไปยังถาวรได้PYTHONPATH
อย่างไร
คำตอบ:
คุณต้องเพิ่มไดเรกทอรีใหม่ของคุณลงในตัวแปรสภาพแวดล้อมPYTHONPATH
คั่นด้วยเครื่องหมายโคลอนจากเนื้อหาก่อนหน้า ใน Unix ทุกรูปแบบคุณสามารถทำได้ในสคริปต์เริ่มต้นที่เหมาะสมกับเชลล์ที่คุณใช้ (.profile
หรืออะไรก็ตามขึ้นอยู่กับเชลล์ที่คุณชื่นชอบ) ด้วยคำสั่งที่ขึ้นอยู่กับเชลล์ที่มีปัญหา ใน Windows คุณสามารถทำได้ผ่านระบบ GUI เพื่อวัตถุประสงค์
superuser.com
อาจเป็นสถานที่ที่ดีกว่าที่จะถามเพิ่มเติมเช่นสำหรับรายละเอียดเพิ่มเติมหากคุณต้องการข้อมูลเฉพาะเกี่ยวกับวิธีเพิ่มคุณค่าให้กับตัวแปรสภาพแวดล้อมในแพลตฟอร์มและเชลล์ที่คุณเลือกเนื่องจากไม่ใช่คำถามการเขียนโปรแกรมจริงๆ
หากคุณกำลังใช้ bash (สำหรับ Mac หรือ GNU / Linux distro) ให้เพิ่มส่วนนี้ของคุณ ~/.bashrc
export PYTHONPATH="${PYTHONPATH}:/my/other/path"
แทนที่จะจัดการกับPYTHONPATH
คุณยังสามารถสร้างแฟ้มการกำหนดเส้นทาง ก่อนอื่นให้ค้นหาว่าไดเรกทอรีใดที่ Python ค้นหาข้อมูลนี้:
python -m site --user-site
ด้วยเหตุผลบางอย่างสิ่งนี้ดูเหมือนจะไม่ทำงานใน Python 2.7 ที่นั่นคุณสามารถใช้:
python -c 'import site; site._script()' --user-site
จากนั้นสร้าง .pth
ไฟล์ในไดเรกทอรีนั้นที่มีเส้นทางที่คุณต้องการเพิ่ม (สร้างไดเรกทอรีหากไม่มีอยู่)
ตัวอย่างเช่น:
# find directory
SITEDIR=$(python -m site --user-site)
# create if it doesn't exist
mkdir -p "$SITEDIR"
# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
python -m site --user-site
และ(create the directory if it doesn't exist)
ชิ้นส่วนได้รับสิ่งที่ผมขาดหายไปจะได้รับมันทำงาน
somelib.pth
หรือไม่ ถ้าไม่เดาว่าทำไมสิ่งนี้อาจไม่ทำงาน?
สิ่งนี้ใช้ได้กับ Windows
จากนั้นคุณจะสามารถดูโมดูลทั้งหมดภายในเส้นทางเหล่านั้นจากสคริปต์ของคุณ
ในกรณีที่ใครยังสับสน - ถ้าคุณใช้ Mac ให้ทำดังนี้:
open .bash_profile
export PYTHONPATH=$PYTHONPATH:foo/bar
export
กุญแจคือสิ่งที่ฉันหายไป !!!! upvoted ขอบคุณมาก!
คุณสามารถเพิ่มเส้นทางผ่านไฟล์ pythonrc ของคุณซึ่งเป็นค่าเริ่มต้นที่ ~ / .pythonrc บน linux กล่าวคือ
import sys
sys.path.append('/path/to/dir')
คุณสามารถตั้งค่าPYTHONPATH
ตัวแปรสภาพแวดล้อมในไฟล์ rc ส่วนกลางเช่น~/.profile
บน mac หรือ linux หรือผ่านแผงควบคุม -> ระบบ -> แท็บขั้นสูง -> ตัวแปรสภาพแวดล้อมบน windows
เพื่อให้คำอธิบายเพิ่มเติม Python จะสร้างพา ธ การค้นหา (ดังที่ได้กล่าวไว้ข้างต้นและที่นี่ ) โดยอัตโนมัติโดยใช้site.py
สคริปต์ (โดยทั่วไปจะอยู่ใน sys.prefix + lib/python<version>/site-packages
รวมทั้งlib/site-python
) หนึ่งสามารถรับค่าของ sys.prefix:
python -c 'import sys; print(sys.prefix)'
สคริปต์ site.py แล้วเพิ่มจำนวนของไดเรกทอรีขึ้นอยู่กับแพลตฟอร์มเช่น/usr/{lib,share}/python<version>/dist-packages
, /usr/local/lib/python<version>/dist-packages
การเส้นทางการค้นหาและการค้นหาเส้นทางเหล่านี้สำหรับ<package>.pth
config ไฟล์ที่มีเส้นทางการค้นหาเพิ่มเติมที่เฉพาะเจาะจง ยกตัวอย่างง่ายต่อการติดตั้งรักษาคอลเลกชันของแพคเกจติดตั้งซึ่งจะมีการเพิ่มไฟล์เช่นระบบที่เฉพาะเจาะจงบน Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth
มัน ในระบบทั่วไปมีไฟล์. pth อยู่มากมายซึ่งสามารถอธิบายพา ธ ที่ไม่คาดคิดใน sys.path:
python -c 'import sys; print(sys.path)'
ดังนั้นหนึ่งสามารถสร้างไฟล์. pth และใส่ในไดเรกทอรีใด ๆ เหล่านี้ (รวมถึง sitedir ดังกล่าวข้างต้น ) นี่เป็นวิธีที่แพ็คเกจส่วนใหญ่จะถูกเพิ่มลงใน sys.path แทนที่จะใช้ PYTHONPATH
หมายเหตุ: ใน OSX จะมีเส้นทางการค้นหาเพิ่มเติมพิเศษที่เพิ่มขึ้นโดย site.py สำหรับ 'framework builds' (แต่ดูเหมือนว่าจะใช้งานได้กับการใช้งานบรรทัดคำสั่งปกติของ python): /Library/Python/<version>/site-packages
(เช่น Python2.7:) /Library/Python/2.7/site-packages/
ซึ่งเป็นที่ที่แพ็คเกจของบุคคลที่สาม ที่จะติดตั้ง (ดู README ใน dir นั้น) ดังนั้นหนึ่งสามารถเพิ่มไฟล์การกำหนดค่าเส้นทางในนั้นมีเส้นทางการค้นหาเพิ่มเติมเช่นสร้างไฟล์ที่เรียกว่า/Library/Python/2.7/site-packages/pip-usr-local.pth
ซึ่งมี/usr/local/lib/python2.7/site-packages/
แล้วระบบงูใหญ่จะเพิ่มเส้นทางการค้นหาที่
สำหรับฉันมันทำงานเมื่อฉันเปลี่ยน.bash_profile
ไฟล์ เพียงแค่เปลี่ยน.bashrc
ไฟล์ทำงานจนกว่าฉันจะรีสตาร์ทเชลล์
สำหรับ python 2.7 ควรมีลักษณะดังนี้:
export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"
ในตอนท้ายของ.bash_profile
ไฟล์
บน linux คุณสามารถสร้างลิงค์สัญลักษณ์จากแพ็คเกจของคุณไปยังไดเรกทอรีของ PYTHONPATH โดยไม่ต้องจัดการกับตัวแปรสภาพแวดล้อม สิ่งที่ต้องการ:
ln -s /your/path /usr/lib/pymodules/python2.7/
การเพิ่มexport PYTHONPATH="${PYTHONPATH}:/my/other/path"
ลงใน ~ / .bashrc อาจไม่ทำงานหากPYTHONPATH
ไม่มีอยู่ในปัจจุบัน (เนื่องจาก:
)
export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"
การเพิ่มข้างบนให้กับ ~ / .bashrc ของฉันทำเคล็ดลับสำหรับฉันบน Ubuntu 16.04
echo PYTHONPATH
และไม่มีอะไรปรากฏขึ้น! นั่นหมายความว่า PYTHONPATH นี้ยังไม่ได้รับการเริ่มต้นดังนั้นฉันเพียงแค่วางบรรทัดนี้export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detection
ใน~/.bashrc
ไฟล์ของฉันและsource ~/.bashrc
มัน ต่อมาเมื่อฉันทำ 'echo $ PYTHONPATH' มันให้ฉัน:<PATH_TO_TF>/TensorFlow/models/research/object_detection
คำแนะนำใด ๆ ถ้าฉันทำอะไรผิดพลาด?
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection
เมื่อคุณส่งออก PYTHONPATH เป็นครั้งแรกที่คุณต้องทำโดยไม่มี${PYTHONPATH}:
ส่วนร่วม
:<PATH_TO_TF>/TensorFlow/models/research/object_detection
และลบลำดับที่export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim
สองออก ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการแก้ไขได้อย่างไร
บน MacOS แทนที่จะให้เส้นทางไปยังไลบรารีเฉพาะ ให้เส้นทางแบบเต็มไปยังโฟลเดอร์โครงการรากใน
~/.bash_profile
ทำให้วันของฉันเป็นตัวอย่าง:
export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"
หลังจากนี้ทำ:
source ~/.bash_profile
เพียงเพิ่มคำตอบของ awesomo คุณสามารถเพิ่มบรรทัดนั้นลงใน~/.bash_profile
หรือ~/.profile
.bash_profile
ถ้าคุณใช้ล็อกอินเชลล์มิฉะนั้นให้ใช้.profile
การเพิ่มพา ธ ใหม่ไปยัง PYTHONPATH ดำเนินการด้วยตนเองโดย:
การเพิ่มพา ธ ไปยังโปรไฟล์ ~ / .bashrc ของคุณในเทอร์มินัลโดย:
vim ~/.bashrc
วางสิ่งต่อไปนี้ในโปรไฟล์ของคุณ
export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"
จากนั้นตรวจสอบให้แน่ใจว่าได้ระบุโปรไฟล์ bashrc ของคุณเมื่อคุณเรียกใช้รหัสในเทอร์มินัล:
source ~/.bashrc
หวังว่านี่จะช่วยได้
ฉันเพิ่มอย่างถาวรใน Windows Vista, Python 3.5
ระบบ> แผงควบคุม> การตั้งค่าระบบขั้นสูง> ขั้นสูง (แตะ) ตัวแปรสภาพแวดล้อม> ตัวแปรระบบ> (หากคุณไม่เห็น PYTHONPATH ในคอลัมน์ตัวแปร) (คลิก) ใหม่> ชื่อตัวแปร: PYTHONPATH> ค่าตัวแปร:
กรุณาเขียนไดเรกทอรีในค่าตัวแปร มันเป็นรายละเอียดของคำตอบของ Blue Peppers
สคริปต์ด้านล่างใช้งานได้กับทุกแพลตฟอร์มเนื่องจากเป็น Python แท้ มันใช้ประโยชน์จาก Pathlib Path ซึ่งบันทึกไว้ที่นี่https://docs.python.org/3/library/pathlib.htmlเพื่อให้ทำงานข้ามแพลตฟอร์มได้ คุณรันครั้งเดียวรีสตาร์ทเคอร์เนลและมัน แรงบันดาลใจจากhttps://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574
from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path
if str(to_add) not in path:
minLen=999999
for index,directory in enumerate(path):
if 'site-packages' in directory and len(directory)<=minLen:
minLen=len(directory)
stpi=index
pathSitePckgs=Path(path[stpi])
with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
pth_file.write(str(to_add))
นี่คือการอัปเดตของเธรดนี้ซึ่งมีคำตอบเก่า ๆ
สำหรับผู้ที่ใช้ MAC-OS Catalina หรือใหม่กว่า (> = 10.15) จะมีการแนะนำ Terminal ใหม่ที่มีชื่อว่าzsh
(แทนที่เก่า)bash
)
ฉันมีปัญหาบางอย่างกับคำตอบข้างต้นเนื่องจากการเปลี่ยนแปลงนี้และฉันค่อนข้างได้วิธีแก้ปัญหาด้วยการสร้างไฟล์~/.zshrc
และวางไดเรกทอรีไฟล์ไปยัง$PATH
และ$PYTHONPATH
ดังนั้นก่อนอื่นฉัน:
nano ~/.zshrc
เมื่อบรรณาธิการเปิดฉันวางเนื้อหาต่อไปนี้:
export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
บันทึกและรีสตาร์ทเครื่อง
สำคัญ:เส้นทางข้างต้นถูกกำหนดเป็นเส้นทางของคอมพิวเตอร์ของฉันคุณจะต้องปรับให้เข้ากับงูหลามของคุณ
ใน Python 3.6.4 คุณสามารถคง sys.path ข้ามเซสชัน python ดังนี้:
import sys
import os
print(str(sys.path))
dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")
root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")
sys.path.insert(0, root_dir)
print(str(sys.path))
ฉันขอแนะนำให้คุณใช้ virtualenv และ virtualenvwrapper ไม่เช่นนั้นคุณจะทำให้เส้นทางของคุณรก
เส้นทางที่สั้นที่สุดระหว่าง A <-> B เป็นเส้นตรง
import sys
if not 'NEW_PATH' in sys.path:
sys.path += ['NEW_PATH']