Как я могу использовать скрипт Python в командной строке, не переходя в его каталог? Это ПИТОНАТ?

157

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

Рэнди Скретка
источник
1
Можем ли мы изменить заголовок этого поста? Это на самом деле не просит объяснения PYTHONPATH.
Нико Чернек
Отредактированный заголовок, потому что это первое, что появляется при PYTHONPATH
Raphael

Ответы:

194

Я думаю, что вы немного смущены. 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#envvar-PYTHONPATH

То, что вы ищете, это ПУТЬ.

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

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

#!/usr/bin/env python

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

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

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

Педро Вернек
источник
2
Спасибо друг. Я все еще сглаживаю это. Мой скрипт успешно импортирует мои модули из моей пользовательской PYTHONPATH. И теперь я понимаю разницу: все дело в сценарии и модуле; вызов командного сценария и импорт Python. Да, я действительно буду использоватьexport PATH=$PATH:/home/etc
Рэнди Скретка
57

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

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

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

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

Ричард
источник
38

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

codedstructure
источник
Дело принято. В этом конкретном случае добавление в PYTHONPATH, похоже, работает хорошо. Как один пользователь на одной машине, я могу использовать и повторно использовать уже написанный .py код.
Рэнди Скретка
1
Я, честно говоря, не думаю, что установка вещей по системно-зависимым путям с необходимыми правами root - лучшая идея, чем использование PYTHONPATH. Я уже не считаю, сколько раз мне приходилось иметь дело с зачаточной программой на Python, которая настаивала на том, pip installчто я являюсь обычным пользователем на хосте не только без root-доступа (я знаю, что pip может выполнять локальную установку), но и также без пипа. Вот совет всем, кто распространяет программное обеспечение Python - сначала попытайтесь установить свое собственное программное обеспечение на хосте Linux, где у вас нет root-доступа и только основной дистрибутив Python без pip.
amn
3

Я думаю, что вы перепутали между 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
W4t3randWind
источник
3

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

python -m gmbx

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

Тигран Салуев
источник