2017-09-03 17 views
0

私はこのようになりますPythonライブラリ(ない鉱山)に取り組んでいます:インポートが副作用をもたらすライブラリをPythonでパッケージ化するには?

. 
├── README.md 
├── setup.py 
└── library 
    ├── __init__.py 
    ├── core.py 
    ├── a.py 
    └── b.py 

自体がa.pyb.py使用core.pyのファイル__init__.pyメイク使用。注目すべき重要なことは、import libraryに意図的に意図されているいくつかの面倒があることです。

しかし、私はユーザに副作用なしでcore.pyの機能を使用する可能性を与えたいと思います。残念ながら、ご存知のように、import library.coreまたはfrom library import coreは、とにかく(副作用が発生する)__init__.pyを実行します。

この問題を解決するために私のパッケージとsetup.pyをどのように再編成できますか?


私はこのような何かを考えた:私はpackages = ['library', 'library_core']setup.pyを更新してしまう

. 
├── README.md 
├── setup.py 
├── library_core 
│ ├── __init__.py 
│ ├── core.py 
│ ├── a.py 
│ └── b.py 
└── library 
    └── __init__.py # Import library_core and apply side effects 

。こうすると、libraryをインポートしても何も変更されませんが、ユーザーは副作用なしでlibrary_coreをインポートできます。また、これはコードの複製を避け、すべてが同じリポジトリにとどまるでしょう。

残念ながら、library_corelibraryからインポートする機能がファイルツリーの同じ場所にないため、この機能は動作しません。

+0

. ├── README.md ├── setup.py └── library ├── __init__.py └── core ├── __init__.py ├── a.py └── b.py 

そしてsetup.py中:

ファイルツリーはこのようになります。 * - あなたの主な問題ですが、 'library/__ init __。py'で' library_core import core'を実行しようとするとどうなりますか? – Kos

+0

@Kos実際には、これはうまくいくかもしれません...私は 'from ..'import library_core'はパッケージが' python setup.py install'でインストールされた後**動作します。私はこれが行く方法だと思います。だから私はその質問を空白にします。 – Delgan

答えて

0

2つのパッケージを使用するのが最善の方法です。

隣接する2つのパッケージを使用すると、(たとえばpython setup.py install)がインストールされている場合にのみ、が動作します。例えば、単体テストでは、開発がかなり複雑になります。インストールされていないとlibrary_coreが見つかりませんでしたので、import libraryを実行することは不可能でした。

したがって、サブパッケージを作成し、package_dirオプションのおかげでlibrary_coreがあるsetup.pyの範囲内で指定するのが最善の解決策です。 「私は、ライブラリからlibrary_coreをインポートする機能を持っていないので、残念ながら、これは動作しません」*

setup(
    name = 'library', 
    packages = ['library', 'library.core', 'library_core'], 
    package_dir = {'library_core': 'library/core'}, 
    ... 
) 
0

私は副作用に頼るのをやめて、ドキュメント化された関数を呼び出すことによって明示的にトリガーすることをユーザーに要求することをお勧めします。さもなければ、あなたは敗北戦闘に挑戦しています。デフォルトでは現在、副作用が引き起こされています。ユーザーがそれらを望んでいない場合は、元に戻す必要があります。

+0

これは私のライブラリではありません。すでに普及しているので、現在の動作を変更する方法はありません。 – Delgan

+0

ルールに対する一般的な例外は、polyfillライブラリです。 __future__ import absolute_import'と比較して対比します。しかし、ええ、それは不便です、例えばflake8は "未使用"の輸入について不平を言うでしょう – Kos

関連する問題