เพิ่มไดเรกทอรีไปยัง PYTHONPATH อย่างถาวรหรือไม่


324

เมื่อใดก็ตามที่ฉันใช้sys.path.appendไดเรกทอรีใหม่จะถูกเพิ่ม อย่างไรก็ตามเมื่อฉันปิด python รายการจะเปลี่ยนกลับเป็นค่าก่อนหน้า (ค่าเริ่มต้นหรือไม่) ฉันจะเพิ่มไดเรกทอรีไปยังถาวรได้PYTHONPATHอย่างไร

คำตอบ:


135

คุณต้องเพิ่มไดเรกทอรีใหม่ของคุณลงในตัวแปรสภาพแวดล้อมPYTHONPATHคั่นด้วยเครื่องหมายโคลอนจากเนื้อหาก่อนหน้า ใน Unix ทุกรูปแบบคุณสามารถทำได้ในสคริปต์เริ่มต้นที่เหมาะสมกับเชลล์ที่คุณใช้ (.profileหรืออะไรก็ตามขึ้นอยู่กับเชลล์ที่คุณชื่นชอบ) ด้วยคำสั่งที่ขึ้นอยู่กับเชลล์ที่มีปัญหา ใน Windows คุณสามารถทำได้ผ่านระบบ GUI เพื่อวัตถุประสงค์

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


8
ข้อผิดพลาด: ตัวคั่นบน windows จะเป็นเครื่องหมายอัฒภาค หากคุณต้องการแทนที่เส้นทางของระบบบน windows การตั้งค่าผ่าน GUI เป็นตัวแปรสภาพแวดล้อมของผู้ใช้อาจไม่เพียงพอเนื่องจากตัวแปรผู้ใช้จะถูกผนวกเข้ากับตัวแปรระบบ ในกรณีเหล่านี้คุณจะต้องใช้สคริปต์เริ่มต้นที่จะทำการปรับเปลี่ยนที่จำเป็น
Nathan Ernst

1
@Nathan, TX สำหรับการแจ้งเตือนบนอัฒภาค แต่ (ถ้าคุณเป็นผู้ดูแลระบบของหลักสูตร) คุณสามารถตั้งค่าระบบ env.vars บน windows (บวก, OP จะไม่ถามถึงวิธีการแทนที่เส้นทางเพียงแค่วิธีการผนวกกับมัน ดังนั้นผู้ใช้ env.var ก็ใช้ได้เช่นกัน! -)
Alex Martelli

น่าเสียดายที่ฉันไม่ใช่ผู้ดูแลระบบบนพีซีที่ทำงานของฉัน :(
Nathan Ernst

439

หากคุณกำลังใช้ bash (สำหรับ Mac หรือ GNU / Linux distro) ให้เพิ่มส่วนนี้ของคุณ ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

28
สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน แต่ให้แน่ใจว่าไดเรกทอรีที่คุณชี้ไปมีอยู่ที่ไฟล์init .py สูงสุดในโครงสร้างไดเรกทอรีของคุณ ตอนแรกยังไม่ชัดเจนสำหรับฉันเลย ตัวอย่างเช่นผมพยายามส่งออก PYTHONPATH = $ PYTHONPATH: / ผู้ใช้ / joey / Reposแต่มันก็ไม่ได้ทำงานเพราะไดเรกทอรี Repos ของฉันไม่ได้มี _ init_ .py การลงหนึ่งไดเรกทอรีเพิ่มเติม: / Users / joey / repos / specificRepoทำกลอุบายได้ ตอนนี้หลามสามารถสำรวจไดเรคทอรีใด ๆ ที่เชื่อมต่อกับไดเรกทอรีrepo ที่มีinit .py!
Qiao Yi

3
สิ่งนี้ใช้ได้สำหรับฉัน แต่คุณสามารถอธิบายได้ว่าตัวแปร PYTHONPATH นี้ตั้งอยู่ที่ใด และ "ส่งออก PYTHONPATH" รู้วิธีการค้นหาไฟล์ที่แน่นอน?
appleLover

42
จำหลังจากที่คุณแก้ไข~/.bashrcแล้วเรียกใช้source ~/.bashrcดูstackoverflow.com/questions/2518127/ …
b_dev

2
ฉันคิดว่าเป็นความคิดที่ดีที่จะsudo suเริ่มต้นไฟล์. bashrc ของคุณ โพสต์นี้เห็นด้วยกับฉัน อย่างน้อยในระบบของฉันก็ไม่จำเป็นด้วยซ้ำ
LondonRob

นี่คือคำตอบ
Aerin

88

แทนที่จะจัดการกับ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 2.6 และดูเหมือนว่าจะไม่เหมาะกับฉันเลย
Lorcan O'Neill

4
ฉันเพิ่งเชื่อมโยงไดเรกทอรีนี้กับไดเรกทอรีห้องสมุดของฉันและเก็บสคริปต์ทั้งหมดของฉันไว้ที่นั่น ทำงานได้ดี
firesofmay

มีมติให้ลองอีกครั้งหลังจากพบหัวข้อนี้อีกครั้งและจัดการเพื่อให้ทำงานได้ดีกว่าเวลานี้! โหวตขึ้นและขอโทษขอโทษ :)
Lorcan O'Neill

นี้ทำงานได้อย่างสมบูรณ์แบบผมกำลังอยู่บนเส้นทางที่ถูกต้อง แต่python -m site --user-siteและ(create the directory if it doesn't exist)ชิ้นส่วนได้รับสิ่งที่ผมขาดหายไปจะได้รับมันทำงาน
Aurélien Ooms

1
ฉันจำเป็นต้องใช้ขั้นตอนเพิ่มเติมเพื่อให้งูเหลือมรู้จักเส้นทางที่เพิ่มเข้ามาsomelib.pthหรือไม่ ถ้าไม่เดาว่าทำไมสิ่งนี้อาจไม่ทำงาน?
Miladiouss

38

สิ่งนี้ใช้ได้กับ Windows

  1. บน Windows ด้วย Python 2.7 ไปที่โฟลเดอร์การตั้งค่า Python
  2. เปิด Lib / site-packages
  3. เพิ่มไฟล์เปล่า example.pth ไปยังโฟลเดอร์นี้
  4. เพิ่มพา ธ ที่ต้องการลงในไฟล์หนึ่งรายการต่อแต่ละบรรทัด

จากนั้นคุณจะสามารถดูโมดูลทั้งหมดภายในเส้นทางเหล่านั้นจากสคริปต์ของคุณ


3
IMO นี่เป็นทางออกที่ดีที่สุดเนื่องจากไม่ได้ขึ้นอยู่กับตัวเลือกของเชลล์หรือสภาพแวดล้อมการทำงาน ทำงานบน linux เช่นกันโดยที่เส้นทาง python เริ่มต้นคือ "/usr/local/lib/pythonX.Y/site-packages" หากวิธีนี้ใช้ไม่ได้ผลให้ลองวางไฟล์. pth ของคุณไปยังไดเรกทอรี dist-packages แทน
matus

1
Windows 7, Python 3.6.5 นี่คือคำตอบ ตามที่ auserdude เขียนไว้: สร้าง "example.pth" ในโฟลเดอร์ Python Lib / site-packages จากนั้นเพิ่มเส้นทางของคุณดังนี้: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123

คำตอบที่ดีเยี่ยมยังใช้งานได้กับ python 3.7 บน windows 10, windows 10 path ของฉันคือ: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
Ali80

สามารถยืนยันได้ว่ามันใช้งานได้กับ Python 3.6.7 บน Windows 10 อย่างไรก็ตามโปรดทราบว่าพา ธ นั้นถูกผนวกเข้ากับ PYTHONPATH ของคุณด้วยหมายความว่าโมดูลที่ต่อท้ายของคุณจะไม่พบในกรณีที่มีการชนกันของชื่อ
BramAppel

25

ในกรณีที่ใครยังสับสน - ถ้าคุณใช้ Mac ให้ทำดังนี้:

  1. เปิด Terminal ขึ้นมา
  2. ชนิด open .bash_profile
  3. ในไฟล์ข้อความที่ปรากฏขึ้นให้เพิ่มบรรทัดนี้ที่ท้าย: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. บันทึกไฟล์รีสตาร์ท Terminal และคุณทำเสร็จแล้ว

2
ทุกคนสงสัยว่าจะดูเส้นทางของงูหลามได้อย่างไรใช้: งูหลามตัว
Arindam Roychowdhury

ค่อนข้างแน่ใจว่าคุณต้องโหลดเทอร์มินัลอีกครั้ง
ผู้ใช้

จริง ๆ แล้วexportกุญแจคือสิ่งที่ฉันหายไป !!!! upvoted ขอบคุณมาก!
a_m_dev

21

คุณสามารถเพิ่มเส้นทางผ่านไฟล์ pythonrc ของคุณซึ่งเป็นค่าเริ่มต้นที่ ~ / .pythonrc บน linux กล่าวคือ

import sys
sys.path.append('/path/to/dir')

คุณสามารถตั้งค่าPYTHONPATHตัวแปรสภาพแวดล้อมในไฟล์ rc ส่วนกลางเช่น~/.profileบน mac หรือ linux หรือผ่านแผงควบคุม -> ระบบ -> แท็บขั้นสูง -> ตัวแปรสภาพแวดล้อมบน windows


40
sys.path.append ('/ path / to / dir') ไม่ได้เพิ่มรายการอย่างถาวร
jeremyjjbrown

15

เพื่อให้คำอธิบายเพิ่มเติม 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>.pthconfig ไฟล์ที่มีเส้นทางการค้นหาเพิ่มเติมที่เฉพาะเจาะจง ยกตัวอย่างง่ายต่อการติดตั้งรักษาคอลเลกชันของแพคเกจติดตั้งซึ่งจะมีการเพิ่มไฟล์เช่นระบบที่เฉพาะเจาะจงบน 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/แล้วระบบงูใหญ่จะเพิ่มเส้นทางการค้นหาที่


10

สำหรับฉันมันทำงานเมื่อฉันเปลี่ยน.bash_profileไฟล์ เพียงแค่เปลี่ยน.bashrcไฟล์ทำงานจนกว่าฉันจะรีสตาร์ทเชลล์

สำหรับ python 2.7 ควรมีลักษณะดังนี้:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

ในตอนท้ายของ.bash_profileไฟล์


1
ถ้าฉันเข้าใจถูกต้องนี่จะส่งออกตัวแปรสำหรับเซสชัน Python ที่เรียกใช้ผ่านเทอร์มินัลใช่มั้ย
jxramos

1
@jxramos - ใช่!
Peter Piper

9

บน linux คุณสามารถสร้างลิงค์สัญลักษณ์จากแพ็คเกจของคุณไปยังไดเรกทอรีของ PYTHONPATH โดยไม่ต้องจัดการกับตัวแปรสภาพแวดล้อม สิ่งที่ต้องการ:

ln -s /your/path /usr/lib/pymodules/python2.7/

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คำแนะนำใด ๆ ถ้าฉันทำอะไรผิดพลาด?
Anu

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detectionเมื่อคุณส่งออก PYTHONPATH เป็นครั้งแรกที่คุณต้องทำโดยไม่มี${PYTHONPATH}:ส่วนร่วม
boyangeor

ขอบคุณ แต่เมื่อใดก็ตามที่ฉันรีบูทคอมพิวเตอร์ของฉันเส้นทางไพ ธ อนจะถูกรีเซ็ตเป็นอันที่ฉันตั้งค่าไว้อันดับที่ 1 :<PATH_TO_TF>/TensorFlow/models/research/object_detectionและลบลำดับที่export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slimสองออก ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการแก้ไขได้อย่างไร
Anu

7

บน MacOS แทนที่จะให้เส้นทางไปยังไลบรารีเฉพาะ ให้เส้นทางแบบเต็มไปยังโฟลเดอร์โครงการรากใน

~/.bash_profile 

ทำให้วันของฉันเป็นตัวอย่าง:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

หลังจากนี้ทำ:

source ~/.bash_profile

6

เพียงเพิ่มคำตอบของ awesomo คุณสามารถเพิ่มบรรทัดนั้นลงใน~/.bash_profileหรือ~/.profile


เพิ่ม.bash_profileถ้าคุณใช้ล็อกอินเชลล์มิฉะนั้นให้ใช้.profile
smac89

3

การเพิ่มพา ธ ใหม่ไปยัง PYTHONPATH ดำเนินการด้วยตนเองโดย:

การเพิ่มพา ธ ไปยังโปรไฟล์ ~ / .bashrc ของคุณในเทอร์มินัลโดย:

vim ~/.bashrc

วางสิ่งต่อไปนี้ในโปรไฟล์ของคุณ

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

จากนั้นตรวจสอบให้แน่ใจว่าได้ระบุโปรไฟล์ bashrc ของคุณเมื่อคุณเรียกใช้รหัสในเทอร์มินัล:

source ~/.bashrc 

หวังว่านี่จะช่วยได้


2

ฉันเพิ่มอย่างถาวรใน Windows Vista, Python 3.5

ระบบ> แผงควบคุม> การตั้งค่าระบบขั้นสูง> ขั้นสูง (แตะ) ตัวแปรสภาพแวดล้อม> ตัวแปรระบบ> (หากคุณไม่เห็น PYTHONPATH ในคอลัมน์ตัวแปร) (คลิก) ใหม่> ชื่อตัวแปร: PYTHONPATH> ค่าตัวแปร:

กรุณาเขียนไดเรกทอรีในค่าตัวแปร มันเป็นรายละเอียดของคำตอบของ Blue Peppers


1

สคริปต์ด้านล่างใช้งานได้กับทุกแพลตฟอร์มเนื่องจากเป็น 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))

1

นี่คือการอัปเดตของเธรดนี้ซึ่งมีคำตอบเก่า ๆ

สำหรับผู้ที่ใช้ 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"

บันทึกและรีสตาร์ทเครื่อง

สำคัญ:เส้นทางข้างต้นถูกกำหนดเป็นเส้นทางของคอมพิวเตอร์ของฉันคุณจะต้องปรับให้เข้ากับงูหลามของคุณ


0

ใน 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 ไม่เช่นนั้นคุณจะทำให้เส้นทางของคุณรก


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