У меня есть структура папок для проекта Python следующим образом:
proj/
├── cars
│ ├── honda.py
│ └── volvo.py
├── trucks
│ ├── chevy.py
│ └── ford.py
├── main.py
└── params.py
Содержание params.py
:
""" Parameters used by other files. """
serial = '12-411-7843'
Содержание honda.py
:
""" Information about Honda car. """
from params import serial
year = 1988
s = serial
print('year is', year)
print('serial is', s)
Изнутри proj proj/
folder я могу запускать скрипты с помощью iPython:
$ cd path/to/proj/
$ ipython
In [1]: run cars/honda.py
year is 1988
serial is 12-411-7843
Если я попытаюсь запустить скрипт с помощью команды python
, я получаю модуль, не найденный error для params.py
:
$ cd path/to/proj/
$ python cars/honda.py
Traceback (most recent call last):
File "cars/honda.py", line 5, in <module>
from params import serial
ModuleNotFoundError: No module named 'params'
Почему не работает подход, использующий команду python
?
ПРИМЕЧАНИЕ. Приведенные выше примеры выполняются на Mac с использованием дистрибутива Anaconda Python. Аналогичный вопрос о проблеме импорта возникает при работе на компьютерах под управлением Windows vs Linux. Однако мой вопрос связан с использованием iPython vs python
на Mac для запуска скриптов.
Выше from params import serial
insert:
import sys
[sys.path.append(i) for i in ['.', '..']]
Это добавит ваш текущий рабочий каталог и его родительский каталог в список местоположений, из которых вы можете импортировать.
proj
Если вы хотите иметь возможность импортировать params
в cars/honda.py
при запуске вашего скрипта из каталогов, являющихся родителями project
, вы можете использовать следующее:
import sys
import os
from functools import reduce
# allow imports when running script from within project dir
[sys.path.append(i) for i in ['.', '..']]
# allow imports when running script from project dir parent dirs
l = []
script_path = os.path.split(sys.argv[0])
for i in range(len(script_path)):
sys.path.append( reduce(os.path.join, script_path[:i+1]) )
proj/
. Есть ли способ заставить его работать относительно пути запуска скрипта?
proj/
это помогает? В общем, просто используйте sys.path.append()
чтобы добавить в список путей, из которых вы можете импортировать ресурсы ...
Проблема местоположения, вы должны написать полный путь для params.py. У Ipython есть символ, который может использовать команду linux. Прежде всего, вы cd директории, интерпретатор может найти params.py. Но для команды python нужен полный путь params.py. Вот почему вы не можете запустить обработку.
Если вы хотите, чтобы импорт ссылался на базовый каталог proj
вы должны установить PYTHONPATH
в этот каталог. В настоящее время honda.py
ищет вокруг moudule
params
внутри своего собственного module
.
~$ cd path/to/project
~$ PYTHONPATH=$(pwd)
В качестве альтернативы вы можете использовать relative imports
.