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

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

5 ответов

Решение

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

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

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

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

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

http://docs.python.org/2/using/cmdline.html

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

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

Однако, чтобы запустить ваш скрипт на Python как программу, вам также необходимо установить шебанг для Python в первой строке. Примерно так должно работать:

#!/usr/bin/env python

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

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

Тогда вы сможете просто запустить gmbx.py откуда угодно.

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

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

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

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

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 и пакеты более низкого уровня.

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

python -m gmbx

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

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

which myscript.py

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

$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
Другие вопросы по тегам