Импорт модулей с одинаковым именем - PullRequest
0 голосов
/ 02 мая 2018

По сути, у меня есть два проекта Python, один из которых находится под myapp/screening, а другой myapp/server. В настоящее время я занимаюсь разработкой модуля server и хочу импортировать функции из screening, используя myapp.screening.

Структура моей папки показана ниже:

myapp/
    screening/
        screening-env/
        myapp/
            __init__.py
            screening/
                __init__.py
                screening_task.py
                submodule1/
                    # __init__.py and ub module files
                submodule2/
                    # __init__.py and sub module files
                submodule3/
                    # __init__.py and sub module files
        tests/
            # __init__.py and test scripts
        setup.py
    server/
        server-env/
        myapp/
            __init__.py
            server/
                __init__.py
                server_task.py
        tests/
            __init__.py
            server_test.py

Я структурировал свой проект, следуя этому ответу .

Мой setup.py в основном, как показано ниже:

from setuptools import setup

setup(
    name='myapp-screening',
    version='0.1.0',
    packages=[
        'myapp.screening',
        'myapp.screening.submodule1',
        'myapp.screening.submodule2',
        'myapp.screening.submodule3'
    ],
)

Я активировал server-env и установил проект проверки, перейдя к myapp/screening/ (тот же каталог, что и setup.py), и запустил python setup.py develop.

Наконец, server_test.py и server_task, такие как ниже:

from myapp.screening.screening_test import foo

foo()

Когда я запускаю python -m myapp.server.server_task или python -m test.server_test, я получаю:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'myapp.screening'

Эта ошибка имеет смысл, если я запускаю python -m myapp.server.server_task, потому что локальный myapp Существующий и может перезаписать установленный myapp, содержащий модули screening.

Есть ли способ импортировать вещи из screening, используя from myapp.screening.screening_task import foo?!

1 Ответ

0 голосов
/ 02 мая 2018

Итак, после еще одного исследования я обнаружил этот похожий (в некотором роде) вопрос , который приводит к импорту модулей Python с одинаковыми именами и Как мне создать Пакет пространства имен в Python? .

Ответ на вопрос «импорт модулей с одинаковым именем» бесполезен, поскольку в нем говорится, что нужно переименовать один модуль или превратить каталог проекта в пакет.

Другой вопрос - именно то, что я хочу. В основном речь идет о pkgutil, с помощью которого вы можете «добавлять» модули к заданному пространству имен.

Я понимаю и разделяю некоторые мнения против этого метода для некоторых случаев (например, this ), но, поскольку он представлен здесь , иногда вам нужны отдельные структуры, чтобы вы не исправляли все вместе даже когда ты не хочешь всего

...