Python не может найти модуль в родительском каталоге

1

У меня есть структура папок для проекта 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 для запуска скриптов.

  • 0
    Возможная копия ImportError: нет модуля с именем <кое-что>
  • 0
    @Dyno Я отредактировал свой вопрос, чтобы объяснить отличие от возможного дублирующего вопроса.
Показать ещё 2 комментария
Теги:
python-3.x
ipython

3 ответа

1

Выше 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]) )
  • 0
    Это работает из папки proj/ . Есть ли способ заставить его работать относительно пути запуска скрипта?
  • 0
    @wigging Я обновил свой ответ, чтобы обработать случай, когда вы запускаете скрипт из родительского каталога proj/ это помогает? В общем, просто используйте sys.path.append() чтобы добавить в список путей, из которых вы можете импортировать ресурсы ...
Показать ещё 4 комментария
0

Проблема местоположения, вы должны написать полный путь для params.py. У Ipython есть символ, который может использовать команду linux. Прежде всего, вы cd директории, интерпретатор может найти params.py. Но для команды python нужен полный путь params.py. Вот почему вы не можете запустить обработку.

0

Если вы хотите, чтобы импорт ссылался на базовый каталог proj вы должны установить PYTHONPATH в этот каталог. В настоящее время honda.py ищет вокруг moudule params внутри своего собственного module.

~$ cd path/to/project
~$ PYTHONPATH=$(pwd)

В качестве альтернативы вы можете использовать relative imports.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню