PYTHONPATH対sys.path


92

別の開発者と私は、PYTHONPATHとsys.pathのどちらを使用して、Pythonがユーザー(たとえば、開発)ディレクトリのPythonパッケージを検索できるようにするかについて意見が異なります。

典型的なディレクトリ構造を持つPythonプロジェクトがあります。

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

script.pyでは、次のようにする必要がありますimport package.lib。パッケージがsite-packagesにインストールされている場合、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を使用する必要がありますか、それとも問題ありませんか?


4
投票と回答はかなり均等に分割されているようですが、これはPYTHON_PATHの使用にわずかに傾いていますが、これはサンプリングノイズまたは質問からの意図しないバイアスである可能性があります。
AJP 2017年

回答:


42

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


10
これについてもう少し詳しく説明してもらえますか?あなたがconda / virtualenv環境を立ち上げたとしても、これはどうやってあなたのpythonパスにトップレベルのディレクトリを置きますか?
compguy24

38

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

しかしsys.path.append、それを行う方法ではありません。あなたは簡単に重複を取得することができ、それは.pthファイルを整理しません。より良い(と、より読みやすいです): site.addsitedir

そしてscript.py、それはパスで利用可能にしたいパッケージの内部にあるので、通常、それを行うのにより適切な場所ではありません。ライブラリモジュールは、sys.path自分自身に触れてはいけません。代わりに、通常、パッケージの外部にアプリのインスタンス化と実行に使用するhashbanged-scriptがあり、この簡単なラッパースクリプトにsys.path-frobbingのような展開の詳細を配置します。


16
の問題site.addsitedirは、それがappendon sys.pathを実行することです。つまり、インストールされたパッケージは、開発中のローカルパッケージよりも優先されます(ヘアプルが続く可能性があります)。sys.path.insert(0...それを克服するために必要です。
Eli Bendersky 2013

5
@EliBendersky:でなければなりませんsys.path.insert(1stackoverflow.com/q/10095037/125507
エンドリス2014年

12

一般に、環境変数(PYTHONPATHなど)の設定は悪い習慣だと考えます。これは1回限りのデバッグで
は問題ないかもしれませんが、これを通常の方法として使用することは良い考えではないかもしれません。

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


5

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

結局のところ、パッケージシステムを使用しているため、パッケージはサイトパッケージにインストールされるため、ユーザーはそれを必要としませんsys.path

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


5

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

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

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


2

前述の理由により、ハッキングPYTHONPATHsys.path良いアイデアもありません。そして、現在のプロジェクトをsite-packagesフォルダーにリンクするには、実際にはpython setup.py developここで説明されているように、より良い方法があります

pip install --editable path/to/project

プロジェクトのルートフォルダーにまだsetup.pyがない場合は、これで十分です。

from setuptools import setup
setup('project')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.