有没有办法从另一个 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_apackage_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.pathntpathposixpath 模块,具体取决于平台,两者实际上都不是 [=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 中的相同全局变量具有相同的值。但这也可能是一个积极的副作用,具体取决于用例。