我已经将我的Python项目重组为一个同名的保护伞。我的项目现在可以看作是多个子系统,而不是相互依赖。这意味着现在每个子模块都可以单独分布,以便只安装所需的依赖项。
旧结构:
/
├─ myproj/
│ ├─ __init__.py
│ ├─ mod1.py
│ ├─ subpackage1/
│ └─ subpackage2/
└─ setup.py
新结构:
/
├─ myproj/
│ ├─ common/
│ │ └─ mod1.py
│ ├─ subpackage1/
│ └─ subpackage2/
└─ setup.py
正如您所看到的,除了
myproj
现在是namespace package以及子包common
、subpackage1
和subpackage2
现在可以独立分发之外,没有什么变化。有没有可能,仍然保留一个唯一的
setup.py
文件,创建3个独立的包?myproj.common
myproj.subpackage1
myproj.subpackage2
另外,我想指定在安装
myproj.subpackage1
时,myproj.common
是必需的,或者myproj.subpackage2
将同时需要myproj.common
和myproj.subpackage1
。 最佳答案
正如Martijn Pieters所说,这只是python代码,所以可以这样做。我觉得这也没那么难。
基本上,您只需要在setup.py中操作命令行参数
import sys
if sys.argv[1] == "subpackage1":
# Remove the first command line argument so the setup function works normally.
sys.argv.pop(1)
# Run setup code for subpackage1 or
# Use a separate setup file and call "import setup_subpackage1"
...
elif sys.argv[1] == "subpackage2":
# Remove the first command line argument so the setup function works normally.
sys.argv.pop(1)
# Run setup code for subpackage2 or
# Use a separate setup file and call "import setup_subpackage2"
...
else:
# Check if they gave common as an argument or just left if blank
if sys.argv[1] == "common":
# Remove the first command line argument so the setup function works normally.
sys.argv.pop(1)
# Run setup code for both packages.
...
不过,正如马蒂金·皮特斯(Martijn Pieters)所说,这一努力可能不值得。Python的主要哲学是简单胜于复杂。如果您的两个子包完全不同,那么它们应该是不同的项目。
示例:Scipy
我试着想一个为什么不这么做的例子,但显然
scipy
是这么做的。所以我劝阻你可能是错的。可能仍然不值得这么做,因为大多数人只是pip install scipy
。很有趣。希比的结构是经过深思熟虑的。Scipy将每个子包都作为一个Python包(包含一个init.py文件的目录)。每个包的内部都有一个setup.py文件。它们还使用
numpy.distutils.misc_util.Configuration
添加子包。如果查看它们的源代码,scipy的主setup.py文件看起来像。
from __future__ import division, print_function, absolute_import
import sys
def configuration(parent_package='',top_path=None):
from numpy.distutils.misc_util import Configuration
config = Configuration('scipy',parent_package,top_path)
config.add_subpackage('cluster')
config.add_subpackage('constants')
config.add_subpackage('fftpack')
config.add_subpackage('integrate')
config.add_subpackage('interpolate')
config.add_subpackage('io')
config.add_subpackage('linalg')
config.add_data_files('*.pxd')
config.add_subpackage('misc')
config.add_subpackage('odr')
config.add_subpackage('optimize')
config.add_subpackage('signal')
config.add_subpackage('sparse')
config.add_subpackage('spatial')
config.add_subpackage('special')
config.add_subpackage('stats')
config.add_subpackage('ndimage')
config.add_subpackage('_build_utils')
config.add_subpackage('_lib')
config.make_config_py()
return config
if __name__ == '__main__':
from numpy.distutils.core import setup
setup(**configuration(top_path='').todict())
看来你已经找到了一个很好的解决方案。
关于python - 分发 namespace 包子模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46415881/