用单个包拆分 python 代码库
Splitting python codebase with single package
我有一些 python 代码,由服务器、客户端和公共代码组成,我试图将它们拆分为共享包名称空间的单独项目。我见过几个类似的问题,但它们似乎指的是独立但名称冲突的包。
我正在尝试制作一个简单的示例
a
├── pkg
│ ├── a.py
│ ├── __init__.py
└── setup.py
b
├── pkg
│ ├── b.py
│ ├── __init__.py
└── setup.py
a/setup.py
import setuptools
setuptools.setup(
name='pkg_a',
packages=setuptools.find_packages(),
entry_points={
'console_scripts': [
'pkga=pkg.a:main'
]
}
)
a.py
def main():
print('Module A')
请注意 b/setup.py
和 b.py
相同,对 a
的引用更改为 b
。
如果我在每个目录中执行 pip install .
,命令 pka
和 pkgb
都有效,但 import pkg.a
或 import pkg.b
仅与最后安装的一起工作。 a.py
和 b.py
以及一个空的 __init__.py
都在 site-packages/pkg
.
中
有什么方法可以让这个设置生效吗?尝试跨包共享包名是个坏主意吗?
你应该使 pkg
成为一个 命名空间包 :
虽然官方推荐基于pkgutil
的第一种方法,但基于setuptools
& pkg_resources
的第二种方法被广泛使用(由于历史原因),如果您需要注入其他库的现有旧命名空间。
对于 setuptools 方式,将此行放入两个库中的 pkg/__init__.py
:
__import__('pkg_resources').declare_namespace(__name__)
在两者中声明它们 setup.py
:
setup(
# ...
namespace_packages=['pkg']
)
完成。
我有一些 python 代码,由服务器、客户端和公共代码组成,我试图将它们拆分为共享包名称空间的单独项目。我见过几个类似的问题,但它们似乎指的是独立但名称冲突的包。
我正在尝试制作一个简单的示例
a
├── pkg
│ ├── a.py
│ ├── __init__.py
└── setup.py
b
├── pkg
│ ├── b.py
│ ├── __init__.py
└── setup.py
a/setup.py
import setuptools
setuptools.setup(
name='pkg_a',
packages=setuptools.find_packages(),
entry_points={
'console_scripts': [
'pkga=pkg.a:main'
]
}
)
a.py
def main():
print('Module A')
请注意 b/setup.py
和 b.py
相同,对 a
的引用更改为 b
。
如果我在每个目录中执行 pip install .
,命令 pka
和 pkgb
都有效,但 import pkg.a
或 import pkg.b
仅与最后安装的一起工作。 a.py
和 b.py
以及一个空的 __init__.py
都在 site-packages/pkg
.
有什么方法可以让这个设置生效吗?尝试跨包共享包名是个坏主意吗?
你应该使 pkg
成为一个 命名空间包 :
虽然官方推荐基于pkgutil
的第一种方法,但基于setuptools
& pkg_resources
的第二种方法被广泛使用(由于历史原因),如果您需要注入其他库的现有旧命名空间。
对于 setuptools 方式,将此行放入两个库中的 pkg/__init__.py
:
__import__('pkg_resources').declare_namespace(__name__)
在两者中声明它们 setup.py
:
setup(
# ...
namespace_packages=['pkg']
)
完成。