Змінна середовища PYTHONPATH ... як мені зробити після цього кожен підкаталог?


9

Я зараз роблю це:

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

Як я можу зробити так, щоб PYTHONPATH міг включати все підкаталог?

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

Відповіді:


14

Це не так, як працює PYTHONPATH; PYTHONPATH трактує свій шлях пошуку інакше, ніж оболонка PATH. Скажімо, я роблю це:

$ 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програмно. Така поведінка є навмисною, і не поводиться нічим як оболонка PATH. Враховуючи підтримку перекладачем пакетів у цьому плані, напевно, є кращий спосіб досягти того, що ви хочете?


3
Людина, я хочу, щоб кожен сайт перевіряв інші ваші облікові записи, перш ніж відмовити вам у наданні привілеїв. Це відстій, починаючи з реп., Особливо з такими речами, як обмеження однієї URL-адреси ... (у мене було більше посилань для вас, ОП)
Джед Сміт

1

Це не те, як працюють змінні PATH середовища - ви надаєте йому каталог верхнього рівня, і саме додаток повинен рекурсувати дерево каталогів, якщо це потрібно.


Отже, якщо у мене є файл python під /home/$USER/myfile.py Чи можу я імпортувати це?
Олексій

Звичайно, чому ти не міг?
ЄЕАА

1

Можна, звичайно, додати підкаталоги каталогу до змінної PYTHONPATH, використовуючи оболонку, звичайно. Зараз у своєму .bashrc використовую щось подібне до наступного:

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

Це стосується всіх підкаталогів вашої користувальницької папки на глибині 2 у дереві. Команда find знаходить каталоги ('-тип d'), а наступні команди sed і tr форматують вихідний звичайний спосіб змінних PATH.

Якщо залишити '-maxdepth 2', буде включено всі підкаталоги вашої домашньої папки, які, ймовірно, досить багато для пошуку. Можливо, це слід зробити лише у вашому каталозі $ HOME / сховища / python-stuff.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.