質問

別の開発者と私は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の場所を想定しているので、脆いです。ユーザーがどこか他の(ほぼ)/コピー/シンボリックリンクscript.pyを移動することを決定した場合には解除されます。

私はそれはPYTHONPATHを使用して、この場合には、それは(疑わしい)不必要なコードを導入しない主な理由は、より良いものである、と思います。

すべての後、あなたはそれを考えるならば、あなたののユーザーのあなたがパッケージングシステムを使用するので、あなたのパッケージは、サイトのパッケージにインストールされますので、そのsys.pathの事を必要としません。

ユーザーが、あなたはそれを呼び出すように、その後、私はいつもの練習はパッケージが外で使用した場合、手動でPYTHONPATHに追加する必要があること、の状態にあることを、認められてきた、「ローカルコピー」から実行することを選択した場合site-packagesます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top