Как использовать PYTHONPATH

Как я могу использовать PYTHONPATH? Когда я пытаюсь запустить script в пути, файл не найденный. Когда я подключился к каталогу, содержащему script, запускается script. Итак, что хорошего PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

После cd в каталог файлов он запускается.

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Почему я не могу использовать PYTHONPATH?

Ответ 1

Я думаю, вы немного смущены. PYTHONPATH устанавливает путь поиска для импорта модулей python, а не для их выполнения, как вы пытаетесь.

PYTHONPATH Увеличьте путь поиска по умолчанию для файлов модулей. формат совпадает с оболочками PATH: один или несколько каталогов пути, разделенные os.pathsep(например, двоеточия в Unix или точки с запятой на Windows). Необязательные каталоги молча игнорируются.

В дополнение к обычным каталогам отдельные записи PYTHONPATH могут обратитесь к zipfiles, содержащим чистые модули Python (в любом источнике или скомпилированная форма). Модули расширения нельзя импортировать из zip файлов.

Путь поиска по умолчанию зависит от установки, но в целом начинается с префикса /lib/pythonversion (см. выше PYTHONHOME). это всегда добавляется к PYTHONPATH.

Дополнительный каталог будет вставлен в путь поиска впереди PYTHONPATH, как описано выше в разделе "Параметры интерфейса". Поиск путь можно манипулировать из программы Python в качестве переменной sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

То, что вы ищете, это PATH.

export PATH=$PATH:/home/randy/lib/python 

Однако для запуска вашего python script в качестве программы вам также необходимо установить shebang для Python в первой строке, Что-то вроде этого должно работать:

#!/usr/bin/env python

И предоставить ему права выполнения:

chmod +x /home/randy/lib/python/gbmx.py

Затем вы сможете просто запустить gmbx.py из любого места.

Ответ 2

Вы путаете PATH и PYTHONPATH. Вам нужно сделать это:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH используется интерпретатором python для определения загружаемых модулей.

PATH используется оболочкой для определения исполняемых файлов.

Ответ 3

PYTHONPATH влияет только на операторы import, но не на поиск интерпретатора Python верхнего уровня файлов Python, заданных в качестве аргументов.

Необходимость установки PYTHONPATH не является хорошей идеей - поскольку с чем-либо, зависящим от переменных среды, репликация объектов на разных компьютерах становится сложной задачей. Лучше использовать Python "пакеты", которые можно установить (используя "pip" или distutils) по системно-зависимым путям, о которых Python уже знает.

Прочитайте https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - "Руководство по сборке автостопом", а также http://docs.python.org/3/tutorial./modules.html - объясняет PYTHONPATH и пакеты более низкого уровня.

Ответ 4

Я думаю, вы перепутались между PATH и PYTHONPATH. Все, что вам нужно сделать, чтобы запустить "script", имеет родительский каталог, прикрепленный к вашей переменной PATH. Вы можете проверить это, запустив

which myscript.py

Кроме того, если myscripy.py зависит от настраиваемых модулей, их родительские каталоги также должны быть добавлены к переменной PYTHONPATH. К сожалению, поскольку разработчики python были явно на наркотиках, тестирование вашего импорта в repl с помощью следующего не гарантирует, что ваш PYTHONPATH установлен правильно для использования в script. Эта часть программирования на языке python является магии и не может быть правильно ответена на stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

Ответ 5

С PYTHONPATH, установленным, как в вашем примере, вы сможете

python -m gmbx

-m заставит Python искать ваш модуль по путям, в которых Python обычно ищет модули, включая то, что вы добавили в PYTHONPATH. Когда вы запускаете интерпретатор наподобие python gmbx.py, он ищет конкретный файл и PYTHONPATH не применяется.