Як я можу використовувати скрипт Python в командному рядку, не входячи в його каталог? Це ПІТОНПАТ?


157

Як я можу скористатися ПІТОНПАТУ? Коли я намагаюся запустити скрипт у шляху, файл не знайдений. Коли я переходжу до каталогу, що містить сценарій, виконується сценарій. Отже, що корисного для ПІТОНПАТУ?

$ 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]

Чому я не можу використовувати ПІТОНПАТУ?


1
Чи можемо ми змінити назву цієї публікації? Це насправді не вимагає пояснення PYTHONPATH.
Ніко Чернек

Відредагований назву , тому що це перша річ , яка з'являється, коли вдаючись до допомогиPYTHONPATH
Raphael

Відповіді:


194

Я думаю, ти трохи розгублений. PYTHONPATH встановлює шлях пошуку для імпорту модулів python, а не для їх виконання, як ви намагаєтеся.

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

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

Шлях пошуку за замовчуванням залежить від встановлення, але зазвичай починається з префікса / 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 як програму, вам також потрібно встановити шебанг для Python у першому рядку. Щось подібне повинно працювати:

#!/usr/bin/env python

І надайте йому пільги на виконання:

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

Тоді ви повинні мати можливість просто бігати gmbx.pyз будь-якого місця.


2
Дякую, друже. Я все ще прасую це. Моєму сценарію все ж вдалося імпортувати мої модулі з мого спеціального PYTHONPATH. І тепер я розумію різницю: мова йде про скрипт проти модуля; виклик скриптів команди проти імпорту python. Так, я фактично використовуюexport PATH=$PATH:/home/etc
Ренді Скретка

57

Ви плутаєте ПАТ і ПІТОНПАТ. Вам потрібно зробити це:

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

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

PATH використовується оболонкою для визначення, які виконувані файли потрібно запустити.


38

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

Необхідність PYTHONPATHвстановлення не є чудовою ідеєю - як і при будь-якому, що залежить від змінних умов середовища, послідовне копіювання речей на різних машинах стає складним. Краще використовувати «пакети» Python, які можна встановити (використовуючи 'pip' або distutils) у залежних від системи шляхах, про які вже знає Python.

Є Розпізнати https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - Керівництво Автостопом Packaging ", а також http://docs.python.org/3/tutorial /modules.html - що пояснює PYTHONPATH та пакети на нижчому рівні.


Точка взята. У цьому конкретному випадку додавання до PYTHONPATH, здається, добре спрацьовує. Як один користувач на одній машині, я можу добре використовувати і повторно використовувати якийсь уже написаний .py-код.
Ренді Скретка

1
Я, чесно кажучи, не думаю, що встановлення речей у залежних від системи шляхів із необхідним доступом до кореня є кращою ідеєю, ніж використання PYTHONPATH. Я більше не рахую, скільки разів мені доводилося стикатися з рудиментарною програмою Python, яка наполягала на тому, pip installщо я був звичайним користувачем на хості, не тільки без кореневого доступу (я знаю, що Pip може робити локальну установку), але також без піп. Ось порада для всіх, хто розповсюджує програмне забезпечення Python - спершу спробуйте встановити власне програмне забезпечення на хості vanilla Linux, де у вас немає кореневого доступу та лише основної дистрибуції Python без pip.
amn

3

Я думаю, ти змішаний між ПАТОМ і ПІТОНПАТОМ. Все, що вам потрібно зробити, щоб запустити 'скрипт' - це мати батьківський каталог, доданий до вашої змінної PATH. Ви можете перевірити це, запустивши

which myscript.py

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

3

З PYTHONPATH, встановленим як у вашому прикладі, ви повинні зробити це

python -m gmbx

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.