web-dev-qa-db-ja.com

sys.path.insert(1、path)の代わりにsys.path.append(path)を使用するのはなぜですか?

編集:Ulf Rompeのコメントに基づいて、「0」ではなく「1」を使用することが重要です、それ以外の場合は sys.path を壊します。

私はかなり長い間(1年以上)pythonをやっていますが、sys.path.append()の代わりにsys.path.insert()を使用することを勧める理由については常に混乱しています。実演させてください。

PyWorkbooksという名前のモジュール(コンピューターにインストールされている)で作業しているが、同時にPyWorkbooksを組み込んだ別のモジュール(PyJobなど)で作業しているとします。 PyJobで作業しているときに、修正しているPyWorkbooksでエラーが見つかったため、開発バージョンをインポートしたいと思います。

両方で作業するには複数の方法があります(たとえば、PyWorkbooksプロジェクトをPyJob内に配置できます)が、それでもパスで遊ぶ必要がある場合があります。ただし、PyWorkbooksが存在するフォルダーに対してsys.path.append()を実行することはできません。どうして? pythonはインストールされたPyWorkbooksを最初に見つけるからです!

これが、sys.path.insert(1、path_to_dev_pyworkbooks)を実行する必要がある理由です

要約すれば:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

または:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

これにより、過去にいくつかのハングアップが発生しました。(コミュニティとして)sys.path.insert(1, path)を推奨し始めた場合、パスを手動で挿入しているように、私はそれを本当に望みます使用したいパスです!

それとも私は何か間違っているのですか?それは時々私を悩ます質問であり、私はそれを公開で望んでいた!

80
Garrett Berg

パッケージ/モジュールの複数のバージョンがある場合は、 virtualenv (強調マイン)を使用する必要があります:

virtualenvは、隔離されたPython環境を作成するツールです。

対処される基本的な問題は、依存関係とバージョンのいずれか、および間接的なアクセス許可です。 LibFooのバージョン1を必要とするアプリケーションがあり、別のアプリケーションがバージョン2を必要とすることを想像してください。これら両方のアプリケーションをどのように使用できますか? すべてを/usr/lib/python2.7/site-packages(またはプラットフォームの標準的な場所)にインストールすると、アップグレードすべきではないアプリケーションを意図せずにアップグレードしてしまう状況に陥りやすくなります。

または、より一般的には、アプリケーションをインストールしてそのままにしておきたい場合はどうでしょうか?アプリケーションが機能する場合、ライブラリまたはそれらのライブラリのバージョンを変更すると、アプリケーションが破損する可能性があります。

また、パッケージをグローバルsite-packagesディレクトリにインストールできない場合はどうなりますか?たとえば、共有ホスト上。

これらすべての場合、virtualenvが役立ちます。独自のインストールディレクトリを持つ環境を作成し、ライブラリを他のvirtualenv環境と共有しません(オプションで、グローバルにインストールされたライブラリにもアクセスしません)。

insert(0,が間違っていると人々が考えるのは、このためです。これは、複数の環境を管理する問題に対する、完全ではなく、一時的な解決策です。

44
agf

Sys.path.insertを本当に使用する必要がある場合は、sys.path [0]をそのままにすることを検討してください。

sys.path.insert(1, path_to_dev_pyworkbooks)

サードパーティのコードは sys.path documentation に依存する可能性があるため、これは重要です。

プログラムの起動時に初期化されると、このリストの最初の項目path [0]は、Pythonインタープリターの呼び出しに使用されたスクリプトを含むディレクトリです。

41
Ulf Rompe

追加と追加の概念を混同しています。次のコードが先頭に追加されます:

sys.path.insert(1,'/thePathToYourFolder/')

インタープリターが通過する検索シーケンスの先頭(正確には2番目)に新しい情報を配置します。 sys.path.append()は、検索シーケンスの最後に物を置きます。

パッケージディレクトリを毎回virtualenvに手動でコーディングする代わりに、PYTHONPATHのようなものを使用することをお勧めします。サイトパッケージとPythonの可能なバージョンを分離するさまざまなエコシステムをセットアップするには、次の2つのブログを読んでください。

  1. pythonエコシステムの概要

  2. ブートストラップpython仮想環境

環境分離への道を進むことに決めた場合、virtualenvwrapperを調べることで確実にメリットが得られます。 http://www.doughellmann.com/docs/virtualenvwrapper/

13
samkhan13