Импорт модуля из файла Python с вызовом других модулей - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь запустить определенный код, теперь требуется следующий импорт файла Python, и я получаю сообщение об ошибке. Я создал игрушечный пример для иллюстрации проблемы. Я работаю на Python версии 3.6.3.
Рассмотрим следующую структуру папок.

root
  |- outside.py
  |- folA
       |- __init__.py
       |- inside.py
       |- folB
            |- __init__.py
            |- eveninside.py

Теперь содержимое этих файлов выглядит следующим образом.

outside.py

import folA.inside
print("Outside")


inside.py

import folB.eveninside
print("Inside")


eveninside.py

print("Even Inside")   #All inits are empty


Теперь, когда я запускаю inside.py , все работает отлично и дает ожидаемые результаты. Но когда я запускаю outside.py, возникает ошибка, говорящая «нет модуля с именем folB». Я попытался добавить системный путь, но изменений нет. Пожалуйста, объясните мне, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Если вы хотите запускать программу только из outside.py, вы можете добавить этот код в список включенных в outside.py:

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '.')))

и добавьте context.py на каждый уровень структуры вашего пакета со следующим кодом:

import os
import sys
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
sys.path.insert(0, path)

_ = ''

затем вы можете импортировать это в свой код, чтобы он знал структуру пакета. то есть from .context import _

Отказ от ответственности: Этот код был получен от кого-то другого, но я не уверен, кто. Возможно эта статья . Я уверен, что существует лучшая практика, но я нашел, что это работает, и context.py делает отличное место для хранения констант в центральном месте. просто импортируйте их вместо подчеркивания

0 голосов
/ 09 июля 2019

Это просто факт того, что python идет смотри модуль из пути python.Здесь, когда вы запускаете снаружи, он пытается увидеть, есть ли в вашем каталоге folB, где находится outside.py.

Два решения.

  1. Вы используете sys.path.append вinside.py, чтобы добавить каталог, в котором находится folA как место, которое нужно искать при попытке импортировать модуль.Я не знаю, насколько это хорошо.

  2. В вашем случае вы можете просто написать в inside.py `import folA.folB.eveninside.Но, очевидно, это не сработает, когда вы запустите inside.py.В этом случае у вас есть первое решение.

...