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

Как я могу использовать PYTHONPATH? Когда я пытаюсь запустить скрипт в пути файла не найдено. Когда я CD к каталогу, содержащему скрипт работает. Так что хорошего 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?

4 ответов


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

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

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

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

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

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

то, что вы ищете-это путь.

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

однако, чтобы запустить скрипт python в качестве программы, вам также нужно установить shebang Python в первой строке. Что-то подобное работа:

#!/usr/bin/env python

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

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

затем вы должны быть в состоянии просто запустить gmbx.py из любой точки мира.


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

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

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

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


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

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

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


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

which myscript.py

кроме того, если myscripy.py зависит от пользовательских модулей, их родительские каталоги также должны быть добавлены к переменной PYTHONPATH. К сожалению, поскольку дизайнеры python были явно на наркотиках, тестирование вашего импорта в repl со следующим не гарантирует, что ваш PYTHONPATH установлен правильно для использования в скрипте. Эта часть программирования 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