有没有办法从另一个 python 包中导入一个 python 包,就好像它是同一代码的一部分一样?
Is there a way to import a python package from another python package, as if it was part of the same code?
假设我们有 python 个软件包 package_a
和 package_b
。作为用户,我希望能够说:
from package_a.package_b import some_functionality
我的问题是:有没有一种方法可以在不直接将 package_b
的代码复制粘贴到 package_a
的情况下支持这一点?
编辑 1:
为了澄清,我有影子命名(我的 python 包的命名方式与我的文件夹相同),我想知道是否有办法让 python 包在某个地方可用否则。
是的,我正在研究如何以一种在域中仍然有意义的方式重命名 package/folder。
这是对 Python 模块系统的滥用,我劝你重新考虑这个设计,但如果你真的必须这样做,你可以通过搞乱 sys.modules
来实现:
在package_a/__init__.py
中:
import sys
import package_b
sys.modules[__name__ + '.package_b'] = package_b
您可以在标准库中看到类似的内容,os.path
是 ntpath
或 posixpath
模块,具体取决于平台,两者实际上都不是 [=17 的一部分=](不可能,os
是模块,不是包)。
https://github.com/python/cpython/blob/master/Lib/os.py
sys.modules['os.path'] = path
使用 setuptools 你可以这样做:
Project
├── setup.py
└── src
├── package_a
│ └── __init__.py
└── package_b
└── __init__.py
setup.py
#!/usr/bin/env python3
import setuptools
setuptools.setup(
name='Project',
version='0.0.7',
packages=[
'package_a',
'package_b',
'package_a.package_b',
],
package_dir={
'package_a': 'src/package_a',
'package_b': 'src/package_b',
'package_a.package_b': 'src/package_b',
},
)
这将有效地安装 package_b
的两个副本,一个作为顶级包,另一个作为 package_a
的子包。这可能是个问题,因为如果例如您在 package_b
中有一个全局变量,那么它不会与 package_a.package_b
中的相同全局变量具有相同的值。但这也可能是一个积极的副作用,具体取决于用例。
假设我们有 python 个软件包 package_a
和 package_b
。作为用户,我希望能够说:
from package_a.package_b import some_functionality
我的问题是:有没有一种方法可以在不直接将 package_b
的代码复制粘贴到 package_a
的情况下支持这一点?
编辑 1:
为了澄清,我有影子命名(我的 python 包的命名方式与我的文件夹相同),我想知道是否有办法让 python 包在某个地方可用否则。
是的,我正在研究如何以一种在域中仍然有意义的方式重命名 package/folder。
这是对 Python 模块系统的滥用,我劝你重新考虑这个设计,但如果你真的必须这样做,你可以通过搞乱 sys.modules
来实现:
在package_a/__init__.py
中:
import sys
import package_b
sys.modules[__name__ + '.package_b'] = package_b
您可以在标准库中看到类似的内容,os.path
是 ntpath
或 posixpath
模块,具体取决于平台,两者实际上都不是 [=17 的一部分=](不可能,os
是模块,不是包)。
https://github.com/python/cpython/blob/master/Lib/os.py
sys.modules['os.path'] = path
使用 setuptools 你可以这样做:
Project
├── setup.py
└── src
├── package_a
│ └── __init__.py
└── package_b
└── __init__.py
setup.py
#!/usr/bin/env python3
import setuptools
setuptools.setup(
name='Project',
version='0.0.7',
packages=[
'package_a',
'package_b',
'package_a.package_b',
],
package_dir={
'package_a': 'src/package_a',
'package_b': 'src/package_b',
'package_a.package_b': 'src/package_b',
},
)
这将有效地安装 package_b
的两个副本,一个作为顶级包,另一个作为 package_a
的子包。这可能是个问题,因为如果例如您在 package_b
中有一个全局变量,那么它不会与 package_a.package_b
中的相同全局变量具有相同的值。但这也可能是一个积极的副作用,具体取决于用例。