วิธีการแก้ไข PYTHONPATH เริ่มต้น (sys.path) ทั่วโลก


33

บนอูบุนตู (10.10) /usr/local/lib/python2.6/site-packages/ระบบฉันมีแพคเกจหลามที่ติดตั้งตัวเองลงไป ไม่มีอยู่ในเส้นทางเริ่มต้น (sys.path) ฉันจะเพิ่มไดเรกทอรีนี้ลงในพา ธ ได้อย่างไร

แน่นอนว่าการตั้งค่า$PYTHONPATHตัวแปรสภาพแวดล้อมเป็นวิธีแก้ปัญหา แต่ฉันกำลังมองหาวิธีที่สวยงามกว่านี้ ตัวอย่างเช่นeasy_installวางแพคเกจที่ติดตั้งไว้ในนั้น sys.path ของฉันมีลักษณะดังนี้:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

เห็นได้ชัดว่าเส้นทางนั้นไม่ใช่ค่าเริ่มต้นที่สร้างไว้ในไบนารี Python

มีไฟล์กำหนดค่าเดียวที่มีรายการด้านบนหรือไม่ หรือในทางที่เป็นไปได้ที่จะแก้ไขมัน?

คำตอบ:


27

เอกสารโมดูลเว็บไซต์และเส้นทางการค้นหาแก้ไขงูใหญ่ดูเหมือนจะเป็นสิ่งที่คุณกำลังมองหา

เท่าที่ฉันเข้าใจมีการเพิ่มรายการเหล่านั้นsys.pathโดย:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (เปลี่ยน 2.6 เป็น Python ในเวอร์ชันของคุณ)

วิธีที่ง่ายที่สุดที่จะเปลี่ยนมันคือการเพิ่มไฟล์ที่มี/usr/local/lib/python2.6/dist-packages/site-packages.pth../site-packages

หรือคุณอาจสอนแพ็คเก็จให้ใช้site.getsitepackages()?


1
ขอบคุณทำงานได้อย่างสมบูรณ์แบบ :) (ฉันลงเอยด้วยการเพิ่มไฟล์. pth ไปที่ /usr/local/python2.6/dist-packages ซึ่งมี "../site-packages")
Latanius

1
นอกจากนี้คุณยังสามารถสร้างโมดูลที่เรียกว่าsitecustomize.pyซึ่งsite.pyพยายามที่จะนำเข้าและปรับเปลี่ยนsys.pathมี
TestUser16418

5

คุณอาจสร้างไฟล์ใหม่ที่เรียกว่า/etc/profile.d/local_python.shมีเนื้อหา

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

ซึ่งจะตั้งค่าPYTHONPATHตัวแปรสำหรับผู้ใช้ที่ล็อกอินทั้งหมดในระบบของคุณ


7
นี่ไม่ใช่สากลจริงๆ กลไก /etc/profile.d จะทำงานกับล็อกอินเชลล์สำหรับผู้ที่มีเชลล์ที่ใช้ /etc/profile.d (bash / ksh / zsh) เท่านั้น ฉันแน่ใจว่าผู้ใช้ csh จะไม่เห็นการเปลี่ยนแปลงนี้ นอกจากนี้จะถูกละเว้นใน cron / at jobs
Rich Homolka

2
นี่เป็นวิธีที่ดีในการตั้งค่าตัวแปรสภาพแวดล้อมทั่วโลก (ยังเป็นอีกสิ่งหนึ่งที่ฉันได้เรียนรู้ในวันนี้) แต่ตามที่ฉันพูดถึงในโพสต์ฉันกำลังมองหาวิธี Pythonic เพิ่มเติม :)
Latanius

4

ฉันต้องการสรุปสิ่งที่ค้นพบของฉันเกี่ยวกับการปรับเปลี่ยนเส้นทางของงูใหญ่ มีสองวิธีที่จะทำ

  • ไฟล์. pth
  • PYTHONPATH

ไฟล์. pth ใด ๆที่พบในพา ธ เริ่มต้น (ดูที่การร้อง) จะได้รับเนื้อหาในsys.pathนั้น รูปแบบของไฟล์. pth ที่กล่าวนั้นง่าย: หนึ่งพา ธ (โฟลเดอร์) ต่อบรรทัด น่าแปลกที่เส้นทางสามารถเป็นแบบสัมบูรณ์หรือสัมพันธ์กับไฟล์. pth

เส้นทางเริ่มต้นคือที่อยู่ล่ามและ<some-prefix>/lib/python<version>/site-packagesที่มักจะ<some-prefix>/usr/

PYTHONPATHเป็นตัวแปรด้านสิ่งแวดล้อมของระบบปฏิบัติการของคุณ บนระบบ UNIX envคุณรายการพวกเขาโดย การแก้ไขตัวแปรดังกล่าวทั่วโลกทำได้โดยใช้สคริปต์. shภายใน/etc/profile.d/โฟลเดอร์ตามที่ระบุโดย @ TestUser16418


2
มันเป็น PYTHONPATH ที่ไม่มี "_"
heroxbd

1

ตัวอย่างเช่นหากคุณต้องการนำเข้าsudsโมดูลที่มีอยู่ใน.eggไฟล์:

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

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