导入同名模块[重复]

问题描述 投票:0回答:1

基本上,我有两个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
导入内容?!

python python-import setuptools setup.py
1个回答
1
投票

因此,经过更多研究,我发现这个类似(在某种程度上)的问题导致导入具有相同名称的Python模块如何在Python中创建命名空间包?.

“导入同名模块”的答案没有用,因为它说重命名一个模块或将项目目录变成一个包。

另一个问题正是我想要的。它基本上讨论了

pkgutil
,您可以使用它将模块“附加”到给定的命名空间。

我理解并分享一些针对某些情况(例如this)反对此技术的意见,但由于它在here中呈现,有时您需要单独的结构,这样即使您不想要所有内容,也不会将所有内容修补在一起

© www.soinside.com 2019 - 2024. All rights reserved.