Python パッケージとその中にコンパイルされたコンポーネントを含むプロジェクトがあります。現在のディレクトリ レイアウトは次のとおりです。
<project>
foo/
foo/__init__.py
foo/...
src/
src/c_foo.c
tests/
tests/test_foo.py
setup.py
プロジェクトがビルドされると、distutilsは仮想環境にbuild/lib
追加またはインストールするディレクトリを作成します。PYTHONPATH
結果の構造は次のとおりです。
<project>
build/lib
build/lib/foo/__init__.py
build/lib/foo/c_foo.so
問題は、プロジェクト ルートから Python インタープリター セッションを開始したり、プロジェクト ルートからテストを実行したりすると、ビルドされたツリーではなくソース ツリーが取得されることです。
これに対するいくつかの既存の解決策が使用されていることがわかりました。
Python ソースを別のディレクトリに配置します。
lib/foo
などmodules/foo
。これの欠点は、すべてのソース ファイルに追加のディレクトリ レベルが追加されることと、コンパイルされた拡張機能を持たず、したがってルート ディレクトリに python パッケージがあるプロジェクトとの不一致です。つまり、
chdir
Python インタープリターが (ビルド スクリプトまたは手動で) ソース パッケージを認識しないように、プロジェクト ルートの外 (例: tests/ ディレクトリ) に移動する必要があります。パッケージを別の名前 (
foo-module
または などfoo-lib
) でルートに保存し、適切なpackage_dir={'foo':'lib-foo'}
行を に追加しsetup.py
ます。これは pt のバリエーションです。1 にディレクトリ階層の余分なレベルがなくても、ほとんど同じことだと思います。パッケージをルートに保持して使用しますが
setup.py build_ext --inplace
、これによりソース ツリーが汚染されます。
どちらの場合も、ソース ツリーから直接コードを変更/実行できる単純な python プロジェクトに対して、オーバーヘッドが発生します。上記の長所と短所、およびプロジェクトで使用する特定の方法について、皆さんの考えをぜひお聞かせください。