103

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

典型的なディレクトリ構造を持つ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

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

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

4

6 に答える 6

42

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

于 2009-12-12T14:39:06.753 に答える
40

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

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

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

于 2009-12-12T14:54:30.283 に答える
13

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


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

于 2009-12-12T17:06:49.553 に答える
11

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

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

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

于 2009-12-12T15:44:19.933 に答える
5

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

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

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

于 2009-12-12T14:40:48.220 に答える
5

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

pip install --editable path/to/project

プロジェクトのルートフォルダーにsetup.pyがまだない場合は、次の手順から始めると十分です。

from setuptools import setup
setup('project')
于 2020-01-03T14:50:18.180 に答える