基本上,我有两个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中创建命名空间包?.
“导入同名模块”的答案没有用,因为它说重命名一个模块或将项目目录变成一个包。
pkgutil
,您可以使用它将模块“附加”到给定的命名空间。
我理解并分享一些针对某些情况(例如this)反对此技术的意见,但由于它在here中呈现,有时您需要单独的结构,这样即使您不想要所有内容,也不会将所有内容修补在一起