ฉันกำลังทำสิ่งนี้อยู่:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
ฉันจะทำให้ PYTHONPATH สามารถรวมทุกสิ่งในไดเรกทอรีย่อยได้อย่างไร
PYTHONPATH = /home/$USER/....and-all-subdirectories
ฉันกำลังทำสิ่งนี้อยู่:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
ฉันจะทำให้ PYTHONPATH สามารถรวมทุกสิ่งในไดเรกทอรีย่อยได้อย่างไร
PYTHONPATH = /home/$USER/....and-all-subdirectories
คำตอบ:
นั่นไม่ใช่วิธีการทำงานของ 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
โปรแกรมอย่างชัดเจน พฤติกรรมนี้มีเจตนาและไม่ทำอะไรเลยเหมือนกับเส้นทางของเชลล์ ด้วยการสนับสนุนของล่ามสำหรับแพ็คเกจในเรื่องนี้แน่นอนว่ามีวิธีที่ดีกว่าในการบรรลุสิ่งที่คุณต้องการ
เป็นไปได้ที่จะเพิ่มไดเรกทอรีย่อยของไดเรกทอรีไปยังตัวแปร 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 ของคุณ