pipを使用してパッケージの複数のバージョンをインストールする


83

私のアプリケーションでは、次のものを使用したいと思います。

  • packageA、必要です packageX==1.3
  • packageB、必要です packageX==1.4
  • packageX==1.5

packageXこの状況を処理するために、pipを使用しての複数のバージョンをインストールするにはどうすればよいですか?


2
パッケージを非標準の場所にインストールしてから、PYTHONPATHを使用してインポートするパッケージを決定します。この回答を
Yibo Yang 2017

1
ちなみに、この質問のシナリオと、現在受け入れられている回答のハッキーな解決策は、パッケージの所有者が依存関係の正確なバージョンを固定することを選択してはならない理由の良い例です。彼らは使用packageX>=1.3,<2しているはずでありpackageX>=1.4,<2(アップストリームのpackageXがセマンティックバージョニングに従っていると仮定して)、ダウンストリームのアプリ開発者としてのあなたはピン留めして使用するのに問題はなくpackageX==1.5、誰もが満足するでしょう。ここでは詳細
RayLuo

回答:


63

pipはこれを支援しません。

特定のバージョンをインストールするように指示できますが、他のバージョンをオーバーライドします。一方、2つのvirtualenvを使用すると、両方のバージョンを同じマシンにインストールできますが、同時に使用することはできません。

最善の策は、両方のバージョンを別の名前でPythonパスに配置して、手動でインストールすることです。

ただし、2つのライブラリが同じ名前を持っていることを期待している場合(そしてそうすべきである場合)、次のようなインポートエイリアスを使用して必要なバージョンを取得するように変更する必要があります。

import dependencyname_version as dependencyname

現在、これを行うためのクリーンな方法はありません。あなたが望むことができる最善のことは、このハックが機能することです。

2つのライブラリの1つを捨てて同等のものに置き換えるか、パッチを適用して新しいバージョンの依存関係を受け入れ、パッチをコミュニティに返したいと思います。


41
これに対する解決策はまだありませんか?
ホーケンリッド2015

2
それでも解決策はありませんか?
AjaxLeung

1
非常に多くの言語でこの問題が発生しています... Java、Go、Haxe ... Node.jsは複数のバージョンの依存関係。
アンディ

15

eaのソースをダウンロードします。パッケージ。それぞれを個別のフォルダにインストールします。例えば。私はバージョン1.10パッケージを持っていましたが、いくつかの作業のために開発バージョンに切り替えたいと思いました。devモジュールのソースをダウンロードし git clone https://github.com/networkx/networkx.git cd netwokrx ました。このバージョンのフォルダーを作成しました mkdir /home/username/opt/python。次に、PYTHONPATH envvarを次のように設定しましたexport PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/。次に、以下を使用してインストールしました。python setup.py install --prefix=/home/username/opt/python

これで、PYTHONPATHがこの他のsite-packagesフォルダーを指しているため、コマンドラインでpythonを実行し、新しいモジュールをインポートすると、機能します。スイッチを元に戻すには、PYTHONPATHから新しいフォルダーを削除します。

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'

2
はぁ、networkxバージョンの違いと戦っているからこそここに来たんだ!
dwanderson

「スイッチを元に戻すには、PYTHONPATHから新しいフォルダを削除します。」から新しいフォルダパスを削除した後でも、この部分は機能しませんsys.path
AvinashRaj19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.