作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个或多或少独立的包(请参阅下面的 apack 和 bpack)。我想让它们都像这样可用:
import mycompany.apack.somemodule
import mycompany.bpack.somemodule
由于它们是独立的,因此我为每个文件都有单独的 setup.py 以将它们部署到 PyPi,因此发布周期也不同。
这里有一个问题:是否可以有根包的子包,并具有单独的发布过程(每个子包都有自己的setup.py)?如何实现这一目标?
这是我尝试过的方法,但无法使其正常工作。我当前的 setup.py 如下所示:
from distutils.core import setup
setup(
name='mycompany-apack',
version='0.1',
packages=['mycompany.apack'],
license='GPLv3')
这些 setup.py 在 dist-packages 文件夹中创建以下结构:
mycompany
apack
__init__.py
somemodule.py
bpack
__init__.py
somemodule.py
现在,由于我的 mycompany 没有 __ init __.py (这是我的猜测),我收到以下错误:
>>> import mycompany.apack.somemodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mycompany.apack.somemodule
最佳答案
使用 setuptools
项目中的 pkg_resources.declare_namespace
。
您可以使用 setuptools 而不是 distutils。它支持依赖管理和命名空间,
对于 apack,项目结构将如下所示:
/apack/
|- mycompany/
| |- __init__.py (1)
| `- apack/
| |- __init__.py
| `- submodule.py
`- setup.py
对于 apack,您的 setup.py
将如下所示:
from setuptools import find_packages
from setuptools import setup
setup(
name='apack',
version='0.1',
packages=find_packages())
标记为 (1) 的 __init__.py
将如下所示:
import pkg_resources
pkg_resources.declare_namespace(__name__)
bpack 看起来非常相似,只不过将 apack
替换为 bpack
。
假设还有一个 cpack,它依赖于 apack 和 bpack。
它看起来很相似,但是 setup.py
看起来像这样:
from setuptools import find_packages
from setuptools import setup
setup(
name='cpack',
version='0.1',
packages=find_packages(),
install_requires=['apack', 'bpack'])
如果安装了 cpack,apack 和 bpack 也会被安装。由于命名空间声明,不会发生冲突
$ virtualenv venv
$ source virtualenv/bin/activate
$ pip install cpack
$ python
>>> from mycompany.apack import submodule
>>> from mycompany.bpack import submodule
>>> from mycompany.cpack import submodule
关于python - 如何在 PyPi 中的某个根包下组织我的包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935118/
我是一名优秀的程序员,十分优秀!