簡體   English   中英

分發命名空間包子模塊

[英]Distributing a namespace package submodules

我已經將我的Python項目重組為同名傘。 我的項目現在可以看作是多個子系統而不是相互依賴。 這意味着現在可以單獨分發每個子模塊,以便只安裝所需的依賴項。

舊結構:

/
├─ myproj/
│  ├─ __init__.py
│  ├─ mod1.py
│  ├─ subpackage1/
│  └─ subpackage2/
└─ setup.py

新結構:

/
├─ myproj/
│  ├─ common/ 
│  │  └─ mod1.py
│  ├─ subpackage1/
│  └─ subpackage2/
└─ setup.py

正如您所看到的那樣,除了myproj現在是命名空間包並且子包common之外沒有太多變化,現在可以獨立分發subpackage1subpackage2

是否仍然可以保留一個唯一的setup.py文件來創建3個獨立的包?

  • myproj.common
  • myproj.subpackage1
  • myproj.subpackage2

另外我想指定在安裝myproj.subpackage1myproj.common是必需的,或myproj.subpackage2需要myproj.commonmyproj.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的結構經過深思熟慮。 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())

所以看起來已經找到了一個很好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM