ตัวแปรสภาพแวดล้อม PYTHONPATH …ฉันจะสร้างทุกไดเรกทอรีย่อยได้อย่างไร


9

ฉันกำลังทำสิ่งนี้อยู่:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

ฉันจะทำให้ PYTHONPATH สามารถรวมทุกสิ่งในไดเรกทอรีย่อยได้อย่างไร

PYTHONPATH = /home/$USER/....and-all-subdirectories

คำตอบ:


14

นั่นไม่ใช่วิธีการทำงานของ PYTHONPATH PYTHONPATH ถือว่าเส้นทางการค้นหาแตกต่างจากเชลล์เส้นทาง สมมติว่าฉันทำสิ่งนี้:

$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py

สิ่งนี้จะใช้งานได้ใน Python ( sys.pathจะรวมไดเรกทอรีปัจจุบัน):

$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> quit()

อย่างไรก็ตามไดเร็กทอรีย่อยจะถือว่าเป็นแพ็กเกจเมื่อ__init__.pyมีอยู่ในไดเร็กทอรีและจะถูกละเว้นโดย PYTHONPATH มิฉะนั้น:

$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> import c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named c

เพื่อให้ได้สิ่งที่อยู่ในไดเรกทอรีย่อยสิ่งนี้จะได้ผล:

>>> from pkg import c   # Works
>>> import pkg.c        # Works

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


3
ผู้ชายฉันหวังว่าแต่ละไซต์จะตรวจสอบบัญชีอื่นของคุณก่อนที่จะปฏิเสธสิทธิ์การโพสต์ของคุณ มัน sucks เริ่มต้นใหม่กับตัวแทนโดยเฉพาะอย่างยิ่งกับสิ่งที่ต้องการวงเงินหนึ่ง URL ... (ฉันมีการอ้างอิงมากขึ้นสำหรับคุณ OP)
เจดสมิ ธ

1

นั่นไม่ใช่วิธีที่ตัวแปรสภาพแวดล้อมของ PATH ทำงาน - คุณให้ไดเรกทอรีระดับบนสุดและเป็นแอพพลิเคชั่นที่จะรีทรีไดเรคทอรีหากจำเป็น


ดังนั้นถ้าฉันมีไฟล์ไพ ธ อนใต้ /home/$USER/myfile.py ฉันสามารถนำเข้าสิ่งนี้ได้หรือไม่
Alex

แน่นอนทำไมคุณทำไม่ได้?
EEAA

1

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

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

ซึ่งจะรวมไดเรกทอรีย่อยทั้งหมดของโฟลเดอร์ผู้ใช้ของคุณเป็นความลึก 2 ในต้นไม้ คำสั่ง find จะหาไดเร็กทอรี ('-type d') และคำสั่ง sed และ tr ต่อไปนี้จะจัดรูปแบบเอาต์พุตในวิธีปกติของตัวแปร PATH

การออกจาก '-maxdepth 2' จะรวมไดเรกทอรีย่อยทั้งหมดของโฟลเดอร์บ้านของคุณซึ่งอาจจะค่อนข้างมากในการค้นหา บางทีสิ่งนี้ควรทำในไดเรกทอรี $ HOME / repository / python-stuff ของคุณ

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