PYTHONPATH対のsys.path
-
19-09-2019 - |
質問
別の開発者と私はPYTHONPATHかのsys.pathは、Pythonは、ユーザ(例えば、開発)のディレクトリにPythonパッケージを見つけることができるようにするために使用すべきかどうかについては意見を異にます。
私たちは、典型的なディレクトリ構造を持つPythonのプロジェクトを持っています:
Project
setup.py
package
__init__.py
lib.py
script.py
script.pyでは、我々はimport package.lib
を行う必要があります。パッケージは、サイトのパッケージでインストールされると、script.pyはpackage.lib
を見つけることができます。
ユーザーディレクトリから作業する場合は、しかし、他の何かを行う必要があります。私のソリューションは、「〜/プロジェクト」を含めるように私のPYTHONPATHを設定することです。別の開発者は、script.pyの初めにこのコード行を置くことを望んでます:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Pythonはpackage.lib
のローカルコピーを見つけることができるように。
私は、この行は、開発者やローカルコピーから実行している人々のためにのみ有用ですが、私はそれが悪い考えですなぜ良い理由を与えることができないとして、これは悪いアイデアだと思います。
私たちはPYTOHNPATH、のsys.pathを使うべきか、のいずれか大丈夫です?
解決
、あなたはあなたのために環境を設定するには、インストールツールを使用する必要があります。 virtualenvのは非常に人気があり、あなたがsetuptoolsのを使用している場合は、単にあなたの現在のPythonのインストールで半インストール作業ツリーにsetup.py develop
を実行することができます。
他のヒント
私はPYTHONPATHを憎みます。私は(特にデーモンのユーザーのための)ユーザーごとに設定し、プロジェクトフォルダが動き回るようを追跡することが脆く迷惑を見つけます。私はむしろ、スタンドアロンのプロジェクトのためのinvokeスクリプトでsys.path
を設定します。
しかしsys.path.append
はそれを行うための方法ではありません。あなたは簡単に複製を取得することができ、そしてそれは.pth
ファイルを整理しません。より良い(と、より読みやすい):。site.addsitedir
そして、それは、のだとscript.py
は、通常の内部で、それを行うには、より適切な場所ではないでしょうあなたがパスに使用できるようにするパッケージ。ライブラリモジュールは確かに自分自身をsys.path
触れるべきではありません。代わりに、あなたは通常、あなたがインスタンス化してアプリケーションを実行するために使用したパッケージの外側hashbangedスクリプトを持っているだろうし、それはあなたがsys.path
-frobbingのような展開の詳細を置くところ、この些細なラッパースクリプトでいます。
一般的に、私は(PYTHONPATHのような)環境変数の設定を検討します
悪い習慣であることを。これは、1つのオフのデバッグのための罰金が、
としてこれを使用するかもしれませんが
定期的な練習は良い考えではないかもしれません。
環境変数の使用方法は、状況につながるとき、いくつかのいずれか
他のコードベースでの問題を報告します。また一つは、同じ練習を運ぶかもしれません
同様に、罰金を実行しているテストのような状況につながるテスト環境
特定の開発者が、いくつかのいずれかのテストを起動したときに、おそらく失敗します。
すでに述べたように、多くの他の理由に加えて、あなたもハードコーディング
OUTHを指すことができ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
それはscript.pyの場所を想定しているので、脆いです。ユーザーがどこか他の(ほぼ)/コピー/シンボリックリンクscript.pyを移動することを決定した場合には解除されます。
私はそれはPYTHONPATHを使用して、この場合には、それは(疑わしい)不必要なコードを導入しない主な理由は、より良いものである、と思います。
すべての後、あなたはそれを考えるならば、あなたののユーザーのあなたがパッケージングシステムを使用するので、あなたのパッケージは、サイトのパッケージにインストールされますので、そのsys.path
の事を必要としません。
ユーザーが、あなたはそれを呼び出すように、その後、私はいつもの練習はパッケージが外で使用した場合、手動でPYTHONPATHに追加する必要があること、の状態にあることを、認められてきた、「ローカルコピー」から実行することを選択した場合site-packagesます。