1. ホーム
  2. python

[解決済み] なぜ sys.path.insert(1, path) の代わりに sys.path.append(path) を使用するのですか?

2023-03-10 18:06:58

質問

編集してください。 Ulf Rompeのコメントに基づいています。 の代わりに "1"を使用することが重要です。 を使うことが重要で、そうしないと sys.path .

私はかなり長い間(1年以上)pythonをやっていますが、なぜ人々があなたに sys.path.append() の代わりに sys.path.insert() . 実演してみましょう。

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

両方で作業する方法は複数ありますが(たとえば、PyJobの中にPyWorkbooksのプロジェクトを入れることができます)、それでもパスで遊ぶ必要が出てくることがあります。 しかし を単純に行うことはできません。 sys.path.append() でPyWorkbooksのあるフォルダに移動します。 . なぜですか? 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) を推奨するようになることを望みます。もしあなたが手動でパスを挿入しているなら、それがあなたが使いたいパスであると言うのは安全だと思います。

それとも私が何か間違っているのでしょうか? それは時々私を悩ませる質問で、私はそれをオープンにしたかったのです!

どのように解決するのですか?

複数のバージョンのパッケージ/モジュールがある場合、そのパッケージ/モジュールに対して virtualenv を使う必要があります (強調)。

virtualenv は、分離された Python 環境を作るためのツールです。

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

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

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

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

というわけで、人々は insert(0, は間違っている、つまり、複数の環境を管理するという問題に対する不完全でその場しのぎの解決策であると考えられている理由です。