【发布时间】:2023-03-10 12:35:01
【问题描述】:
是否可以在不是命名空间包的现有包的命名空间/路径中添加一些东西?
假设有一个名为 package 的现有外部包。
我在我的project.py 中这样使用它:
from package.module import Class
是否可以将名为 extension 的包创建到 package 的命名空间,以便可以从 package.extension 导入?
from package.module import Class
from package.extension.module import ExtensionClass
是否可以只使用pip/setuptools 安装这两个软件包,而无需将猴子补丁添加到我想从package 和package.extension 导入的project.py 中?
部分解决方案
我已经能够通过两种方式实现我所需要的:通过修改原始 package 和通过猴子修补 project.py
结构:
./test.py
./demo/test.py
./demo/__init__.py
./extension/demo/__init__.py
./extension/demo/extension/test.py
./extension/demo/extension/__init__.py
./extension/__init__.py
./test.py的内容:
import demo.test
demo.test.hello()
import demo.extension.test
demo.extension.test.hello()
部分解决方案 1 - 修改原始包
我修改了demo/__init__.py,所以它包含:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
执行示例:
$ export PYTHONPATH=extension
$ python test.py
Hello! I'm demo.
Hello! I'm extension.
部分解决方案 2 - 修改原始包
我修改了./test.py,使其包含猴子补丁:
import pkgutil
import demo
demo.__path__ = pkgutil.extend_path(demo.__path__, demo.__name__)
import demo.test
demo.test.hello()
import demo.extension.test
demo.extension.test.hello()
执行示例:
$ export PYTHONPATH=extension
$ python test.py
Hello! I'm demo.
Hello! I'm extension.
问题(再次)
其中一种解决方案需要原始包的所有者允许扩展,另一种解决方案需要猴子补丁。通过 setup.py/pip 安装的软件包是否有可能不需要更改原始软件包或猴子补丁?
【问题讨论】:
标签: python namespaces pip setuptools pypi