2017-09-26 4 views
3

Pythonプロジェクトを同じ名前の傘下に再構成しました。私のプロジェクトは、お互いに依存することができるよりも、複数のサブシステムとして見えるようになりました。つまり、すべてのサブモジュールを単独で配布できるため、必要な依存関係のみをインストールできます。名前空間パッケージのサブモジュールを配布する

古い構造:

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

新しい構造:

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

あなたはあまりないが、そのmyproj除いて変更されている見ることができるようになりましたnamespace packageで、サブパッケージcommonこと、subpackage1subpackage2を個別に配布できるようになりました。

1つのユニークなsetup.pyファイルを保持して、3つの独立したパッケージを作成することは可能ですか?

  • myproj.subpackage1
  • また
  • myproj.subpackage2
  • 私はmyproj.subpackage1をインストールするときに、myproj.commonが必要であることを指定したいか、そのmyproj.subpackage2myproj.commonmyproj.subpackage1の両方が必要になります

  • myproj.common
    +0

    はい、可能かもしれませんが、それを維持しなければならないほどの労力や苦労はありません。 'セットアップ。py'は*ちょうどPythonコード*ですが、ソースとバイナリのディストリビューションを作成したり、ソースディストリビューションをダウンロードしたときにインストールを処理したり、テストの実行や作成したディストリビューションのアップロードなどのさまざまな追加タスクにも使用されます。 –

    +0

    サブパッケージのメタデータを個別に管理し、a)配布を作成するときに適用するものを決定し、b)作成した配布にその決定を記録して、インストール時に他のオプションやメタデータを誤って取得してしまうことがあります。 –

    答えて

    1

    Martijn Pieters氏はPythonコードであると述べているので、そうすることができます。私はこれがすべて難しいとは思わない。マルタインピータースが述べたように、それはおそらく、努力する価値はありませんが

    は、基本的にはちょうどもう一度

    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. 
        ... 
    

    setup.py

    にコマンドライン引数を操作したいです。 Pythonの主な哲学は、単純なことは複雑なことよりも優れているということです。あなたの2つのサブパッケージが完全に異なっているなら、多分それらは異なるプロジェクトであるべきです。

    例: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()) 
    

    だから、既に良い解決策が見つかっているようです。

    関連する問題