web-dev-qa-db-ja.com

PYTHONPATHとsys.path

別の開発者と私は、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に「〜/ Project」が含まれるように設定することです。別の開発者は、script.pyの先頭に次のコード行を追加したいと考えています。

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

だからPython=はpackage.libのローカルコピーを見つけることができます。

この行は開発者またはローカルコピーから実行している人にのみ役立つため、これは悪い考えだと思いますが、それが悪い考えである理由を説明することはできません。

PYTOHNPATH、sys.pathを使用する必要がありますか、それとも問題ありませんか?

76
gaefan

パスを変更する唯一の理由が作業ツリーから作業している開発者向けである場合、インストールツールを使用して環境をセットアップする必要があります。 virtualenvは非常に人気があり、setuptoolsを使用している場合は、単にsetup.py develop作業中のツリーを現在のPythonインストールでセミインストールします。

42
Ned Batchelder

私はPYTHONPATHが嫌いです。ユーザーごとに設定して(特にデーモンユーザーの場合)設定し、プロジェクトフォルダーが移動するのを追跡するのはもろくて面倒です。むしろsys.pathスタンドアロンプ​​ロジェクトの呼び出しスクリプト内。

しかしながら sys.path.appendはその方法ではありません。簡単に重複を取得できますが、ソートされません.pthファイル。より良い(そしてより読みやすい):site.addsitedir

そして、script.pyは、insideパスで利用可能にするパッケージであるため、通常はこれを行うのに適した場所ではありません。ライブラリモジュールは確かにsys.path自身。代わりに、通常、アプリのインスタンス化と実行に使用するパッケージの外側にhashbanged-scriptがあります。この簡単なラッパースクリプトには、sys.path-フロビング。

34
bobince

一般に、環境変数(PYTHONPATHなど)の設定は悪い習慣であると考えます。これは1回限りのデバッグには適していますが、次のように使用します。
定期的な練習は良いアイデアではないかもしれません。

環境変数を使用すると、「私にとってはうまくいく」などの状況が発生します。
elseはコードベースの問題を報告します。また、テスト環境でも同じプラクティスを実行し、特定の開発者に対してテストは正常に実行されるが、テストを起動するときに失敗するなどの状況につながる可能性があります。

10
sateesh

すでに述べた他の多くの理由に加えて、ハードコーディングも指摘できます。

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

script.pyの場所を推定するため、脆弱です-script.pyがProject/packageにある場合にのみ機能します。ユーザーがscript.pyを(ほぼ)他の場所に移動/コピー/シンボリックリンクすることを決めた場合、それは壊れます。

5
unutbu

この場合、PYTHONPATHを使用する方が優れていると思いますが、これは主に(疑わしい)不必要なコードを導入しないためです。

結局のところ、パッケージシステムを使用しているため、パッケージがサイトパッケージにインストールされるため、考えてみればsersys.pathを必要としません。

ユーザーが「ローカルコピー」から実行することを選択した場合、サイトパッケージの外部で使用する場合、パッケージを手動でPYTHONPATHに追加する必要があることを述べるのが通常の慣行であることがわかりました。 。

4
shylent