6

docssys.pathによると、の最初のエントリは現在のスクリプトのディレクトリです。次のセットアップでは、このデフォルトを変更したいと思います。次のディレクトリ構造を想像してください。

src/
    core/
        stuff/
        tools/
            tool1.py
            tool2.py
    gui/
        morestuff/
        gui.py

スクリプトは、次のようにスクリプトとして実行することを目的としていますtool*.pygui.py

python src/core/tools/tool2.py
python src/gui/gui.py

現在、すべてのツールは からインポートされsrc.core.stuff、GUI には が必要gui.morestuffです。これは、がsys.path[0]を指す必要があることを意味しますが、デフォルトではまたはをsrc/指します。src/core/tools/src/gui/

すべてのスクリプトで調整できsys.path[0]ます (次のような構成を使用して、たとえば の先頭にgui.py):

if __name__ == '__main__':
    if sys.path[0]: sys.path[0] = os.path.dirname(os.path.abspath(sys.path[0]))

ただし、これは一種の冗長であり、何千ものスクリプトを含む成熟したコード ベースでは面倒です。スイッチも知ってい-mます:

python -m gui.gui

ただし、これには現在のディレクトリが必要src/です。

ファイルを変更するなど、目的の結果を達成するためのより良い方法はあり__init__.pyますか?

編集:これはPython 2.7用です:

~$ python -V
Python 2.7.3
4

3 に答える 3

5

パッケージ内のスクリプトを実行する唯一の正式に承認された方法は、-mフラグを使用することです。スクリプトを直接実行してsys.path、各スクリプトで自分で操作を試みることもできますが、それは非常に面倒な作業になる可能性があります。フォルダー間でスクリプトを移動する場合sys.path、新しい場所を反映するために、書き換えのロジックも変更する必要がある場合があります。正しく行ったとしてもsys.path、明示的な相対インポートは正しく機能しません。

現在、python -m mypackage.mymodule作業を行うには、プロジェクトの最上位フォルダー (srcあなたの場合) にいるか、その最上位フォルダーが Python 検索パス上にある必要があります。特定のフォルダにいるように要求するのは厄介です。あなたはそれを望まないと言いました。検索srcパスに入ることが私たちの目標です。

最善の方法は、PYTHONPATH環境変数を使用してインタープリターがプロジェクトのsrcフォルダーを指すようにし、どこからでもパッケージを見つけられるようにすることだと思います。

このソリューションはセットアップが簡単で (環境変数は.profile.bashrcまたは他の同等の場所で自動的に設定できます)、任意の数のスクリプトで機能します。プロジェクトを移動する場合は、環境設定を更新するだけですべての設定が完了し、スクリプトごとにそれ以上の作業を行う必要はありません。

于 2013-04-04T11:29:59.603 に答える
4

ここには 3 つの基本的なオプションがあります。私は、実稼働環境と個人プロジェクトの両方で 3 つすべてを経験しました。多くの点で、それらは相互に構築されています。ただし、私のアドバイスは、最後のものにスキップすることです。

./src根本的な問題は、ディレクトリが python 検索パスにある必要があることです。これこそが、Python パッケージングのすべてです。

パイソンパス

Python パスを調整する最も簡単なユーザー定義の方法は、環境変数を使用することですPYTHONPATH。次のようにして、実行時に設定できます。

PYTHONPATH=/src python src/gui/gui.py

もちろん、これをグローバル環境で設定することもできるので、それを必要とするすべてのプロセスが正しいPYTHONPATH. しかし、覚えておいてください、あなたはいつも1つを忘れます. cron通常、タスクが最終的に実行されるのは午前 3 時です。

サイト パッケージ

環境変数を必要としないようにするためのオプションは、ソース パスの既存のエントリにソフトウェアを含めるか、新しい検索パスを追加する別の方法を見つけることです。したがって、これは、srcディレクトリの内容を/usr/lib/python2.7/site-packagesシステムのsite-packagesある場所にドロップすることを意味します。

サイト パッケージにコードを実際に含めたくない場合があるため、2 つのサブパッケージのシンボリック リンクを作成できます。

もちろん、これは多くの理由で理想的とは言えません。名前付けに注意しないと、突然、マシン上のすべての python プログラムが潜在的な名前の競合にさらされます。マシン上のすべてのユーザーにソフトウェアを公開しています。Python get が更新された場合、問題が発生する可能性があります。新しいサブパッケージを追加する場合は、新しいシンボリック リンクを作成する必要があります。

少し良い方法は.pth、サイト パッケージのどこかにファイルを含めることです。Python がこれらのファイルに遭遇すると、その内容 (ディレクトリの名前であるはず) を検索パスに追加します。これにより、新しいサブパッケージごとに新しいシンボリック リンクを追加することを覚えておく必要があるという問題が回避されます。

virtualenv とパッケージング

最善の解決策は、弾丸を噛んで実際の python パッケージングを行うことです。これをvirtualenv や pipなどの優れたツールと組み合わせることで、隔離された (または半隔離された) Python 環境を実現できます。

virtualenv の下ではsite-packages、ソフトウェアを簡単にインストールできるプロジェクト専用のカスタムがあり、以前のソリューションのすべての問題を回避できます。また、virtualenv を使用すると、実行可能なスクリプトを簡単に維持できるため、実行する Python 環境が期待どおりになります。

1 つの欠点は、virtualenv にソフトウェアを含めるように (python インストーラーに)setup.py指示する を作成して維持する必要があることです。pip内容は次のようになります。

!/usr/bin/env パイソン
# -*- コーディング: utf-8 -*-

distutils.core インポート設定から


設定(
    name='マイプロジェクト',
    package_dir={'myproject': 'src'},
    scripts=['src/gui/gui.py', 'src/core/tools/tool1.py', 'src/core/tools/tool2.py']
)

したがって、この環境をセットアップするには、次のようになります。

virtualenv env
env/bin/pip install -e setup.py

スクリプトを実行するには、次のようにします。

env/bin/tool1.py
于 2013-04-17T05:32:14.113 に答える