Я запускаю 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'
Когда я запускаю подмодуль сам по себе (это приложение для фляги), он работает.
@Sraw, тогда в приложении фляги при запуске напрямую я получаю «ImportError: невозможно импортировать имя 'Gparser' из 'g_plotter'». И в моем основном приложении также возникает ошибка «ModuleNotFoundError: нет модуля с именем 'Gparser'».
Это потому, что ваш дизайн неправильный ... Это немного сложно объяснить в комментариях. Но в основном вы можете представить, что, когда вы напрямую запускаете свой пакет внутри пакета, структура каталогов не содержит ваш верхний каталог пакета. Но когда вы используете его как пакет, структура каталогов будет содержать каталог вашего пакета. Не знаю, достаточно ли это понятно ... По сути, в пакете есть дополнительный каталог-оболочка.






Вы должны использовать абсолютный импорт в 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 может работать.
это не работает для меня. Запуск подмодуля непосредственно из командной строки дает мне: "from. Import Gparser ImportError: невозможно импортировать имя 'Gparser"
@ user994165 Вы не можете использовать from . import something в основном модуле. Этот оператор необходимо использовать в одном пакете.
OK. Я переместил сценарий подмодуля на корневой уровень и изменил импорт на «from g_plotter import Gparser» и использовал тот же импорт в приложении.
Ваша структура неверна. Например, чтобы импортировать
Gparser, вы должны записатьfrom g_plotter import Gparserв том виде, в котором он есть в модуле.