Как использовать 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