Не удалось найти модуль после импорта - PullRequest
0 голосов
/ 09 ноября 2018

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

/g_plotter
          setup.py
          /g_plotter
                    __init__.py
                    g_plotter.py
                    Gparser.py

setup.py

from setuptools import setup

setup(
    name='g_plotter',
    packages=['g_plotter'],
    include_package_data=True,
    install_requires=[
        'flask',
    ],
)

Я установил этот модуль из Docker в свой контейнер:

RUN pip3 install ./g_plotter

Тогда в моем коде приложения:

import g_plotter

print(dir(g_plotter))

который выводит

 server_1  | ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

, поэтому вместо этого используйте этот импорт:

from  g_plotter import g_plotter

Результаты в

server_1  | Traceback (most recent call last):
server_1  |   File "./g_server.py", line 21, in <module>
server_1  |     from  g_plotter import g_plotter
server_1  |   File "/usr/local/lib/python3.7/site-packages/g_plotter/g_plotter.py", line 7, in <module>
server_1  |     import Gparser
server_1  | ModuleNotFoundError: No module named 'Gparser'

Когда я запускаю субмодуль самостоятельно (это приложение для колб), оно работает.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы должны использовать абсолютный импорт в Python 3, import Gparser больше не разрешен. Вы можете изменить его на:

from . import Gparser
from g_plotter import Gparser

Позвольте вам более ясно, я опишу, что они означают.

import Gparser

Gparser = load_module()
sys.modules['Gparser'] = Gparser

from g_plotter import Gparser

Gparser = load_module()
sys.modules[Gparser_name] = Gparser

from . import Gparser

package = find_package(__name__)  # 'g_plotter'
Gparser_name = package + 'Gparser'  # g_plotter.Gparser
Gparser = load_module()
sys.modules[Gparser_name] = Gparser

Теперь вы можете понять, если вы запускаете g_plotter напрямую, на самом деле __name__ равен __main__, поэтому python не может найти пакет из него. Только если вы импортируете этот подмодуль в другой модуль, from . import something может работать.

...