Запуск файла через интерпретатор меняет текущий каталог? - PullRequest
0 голосов
/ 02 марта 2020

Когда я пытаюсь $> python ./tools/test.py, я получаю ошибку импорта, что не могу импортировать модуль, который существует в каталоге, из которого я вызываю python. Тем не менее, я могу импортировать этот модуль, $> python -c "import mod" работает.

Я полагаюсь на тот факт, что ./ находится (в действительности) на PYTHONPATH.

Что такое python делать с путем python, когда я запускаю интерпретатор сценария, который существует в другом каталоге? Есть ли способ «заблокировать» текущий рабочий каталог, чтобы я мог заставить импорт работать?

Мои настройки:

./mod.py:

x = 5     # just for demonstration purposes

./tools/test.py:

from mod import x
# ... snip ... actual content

Я вызываю python из каталога, содержащего mod.py и tools/:

$> python -c "from mod import x"      # works fine
$> python tools/test.py

Traceback (most recent call last):

File "tools/test.py", line 1, in <module>
from mod import x
ModuleNotFoundError: No module named 'mod'

Обратите внимание, что текущий каталог, содержащий mod.py и tools - это , а не на моем PYTHONPATH.

1 Ответ

1 голос
/ 02 марта 2020

Я полагаюсь на тот факт, что ./ (в действительности) на PYTHONPATH.

Это не так. Это не на PYTHONPATH, и это не на sys.path. Когда вы запускаете скрипт по пути к файлу, это каталог script , который добавляется в sys.path. Вы можете увидеть, что добавляется к sys.path для каждого способа указания программы для запуска в документах командной строки Python .

...