10

短いバージョン: どうすれば複数のバージョンの Python の悪夢を取り除くことができますか?

長いバージョン: 何年にもわたって、私はいくつかのバージョンの python を使用してきました。さらに悪いことに、python のいくつかの拡張機能(例: pygame、pylab、wxPython...) を使用してきました。毎回、OS が異なり、アーキテクチャが異なる場合もあります (私の古い PowerPC mac のように)。

現在、私は Mac (x86-64 上の OSX 10.6) を使用していますが、数か月以上前のスクリプトを復活させたいと思うたびに依存関係の悪夢です。Python 自体は既に/usr/bin(2.5, 2.6, 3.1) で 3 つの異なるフレーバーで提供されていますが、pygame 用に macports から 2.4 をインストールする必要がありました。一日の終わりに、私は自分のシステムで7 つ(!) の python インスタンスを所有しています。

しかし、それは問題ではありません。問題は、適切な (つまり、同じセットの) ライブラリがインストールされていないことです。それらのいくつかは 32 ビットであり、いくつかは 64 ビットであり、今ではほとんど迷っています。

たとえば、現在、matplotlib/numpy を使用して wxwidgets ウィンドウの長方形内にリアルタイム プロットを描画していた 3 年前のスクリプト (私が作成したものではありません) を実行しようとしています。しかし、私は惨めに失敗しています: macports の py26-wxpython はインストールされません。ストック python には wxwidgets が含まれていますが、32 ビットと 64 ビットの間でいくつかの競合があり、numpy がありません...なんてめちゃくちゃです!

明らかに、私は物事を間違った方法で行っています。あなたは通常、そのすべての混乱にどのように対処していますか?

4

8 に答える 8

10

virtualenvを使用してこれを解決します。悪夢のような抽象化の層をさらに避けたいという気持ちには共感しますが、virtualenv実際には驚くほどクリーンで使いやすいです。文字通りこれを行います(コマンドライン、Linux):

virtualenv my_env

これにより、新しい Python バイナリとライブラリの場所が作成され、デフォルトで既存のシステム ライブラリへのシンボリック リンクが作成されます。次に、パスを切り替えて新しい環境を使用するには、次のようにします。

source my_env/bin/activate

それでおしまい。モジュールをインストールすると (たとえば でeasy_install)、libディレクトリのディレクトリにインストールされmy_envます。それらは既存のライブラリに干渉せず、奇妙な競合も発生せず、古い環境で機能が停止することもありません。彼らは完全に孤立しています。

環境を終了するには、次のようにします

deactivate

インストールを間違えた場合、またはその環境がもう必要ないと判断した場合は、ディレクトリを削除してください。

rm -rf my_env

これで完了です。それは本当に簡単です。

virtualenv素晴らしいです。;)

于 2010-05-03T17:11:04.993 に答える
4

virtualenvを見てください。

于 2010-05-03T16:43:22.027 に答える
4

いくつかのヒント:

  • Mac OS X では、 の python インストールのみ/Library/Frameworks/Python.frameworkを使用します。
  • numpy/scipy/matplotlib を使用するときはいつでも、考え抜かれた python ディストリビューションをインストールしてください
  • virtualenv と virtualenvwrapper を使用して、これらの「システム」インストールを元の状態に保ちます。理想的には、プロジェクトごとに 1 つの仮想環境を使用して、各プロジェクトの依存関係が満たされるようにします。そして、はい、それは潜在的に多くのコードがさまざまな仮想環境で複製されることを意味します.

それは確かに大きな混乱のように思えますが、少なくとも物事はそのように機能します. 基本的に、プロジェクトの 1 つが virtualenv で動作する場合、「システム」インストールを変更することはないため、どのようなアップグレードを実行しても動作し続けます。

于 2010-05-03T17:12:28.247 に答える
1
  • 必要なPythonバージョンをインストールします。ソースからの場合は、より適切です。
  • スクリプトを作成するときは、完全なPythonバージョン(など#!/usr/local/bin/python2.6)をスクリプトに含めます。

何がうまくいかないのかわかりません。

何かが起こったとしても、それはおそらくあなたのせいではなく、macportsのせいです(私がもうmacportsを使わない理由の1つです)。

私はおそらく何かが欠けていることを知っており、これは反対票を投じられますが、その場合は少なくとも少しコメントを残してください、ありがとう:)

于 2010-05-16T15:06:48.257 に答える
1

私が通常行っていることは、Python のバージョンが登場するたびに (そして、すべての外部依存関係で正しいバージョンが利用可能になったら)、(徐々に) 最新のバージョンに追いつくように努めることです。

ほとんどの場合、Python コード自体は、わずかな変更を加えるだけでそのまま転送できます。

私の最大の Python プロジェクト @ work (15.000+ LOC) は現在、Python 2.6 で数か月です (Python 2.5 からすべてをアップグレードするには、10 以上の依存関係をインストール/チェックするため、ほとんど 1 日かかりました...)

一般的に、これはフリー ソフトウェア スタック内のほとんどの相互依存コンポーネントに対する最善の戦略だと思います (Linux ソフトウェア リポジトリの依存関係を考えてみてください): バージョンを (準) 最新に保つ (または少なくとも: 同じペースで進行する)。 .

于 2010-05-03T16:56:22.803 に答える
0

私はすべてにMacPortsバージョンを使用していますが、お気づきのように、デフォルトバージョンの多くは奇妙に古いものです。たとえば、SnowLeopardのvimomnicompleteには、依存関係としてpython25があります。多くのPython関連のポートには古い依存関係がありますが、通常、たとえば。port install vim +python26の代わりに、ビルド時に新しいバージョンにフラグを立てることができますport install vim +python。何かをインストールする前にドライランを実行して、たとえば、必要のない場合はpython24全体をプルしているかどうかを確認します。ダーウィンの港が軌道に乗ったときの命名規則が望ましいものを残していたため、ポートファイルを頻繁にチェックしてください。実際には、すべてをデフォルトのままにします/opt...PyObjCなどの複製を含むフレームワーク全体のコピーを含むMacPortsのフォルダは、一度に1つのバージョンに固執し、予期せず問題が発生した場合にシステムのデフォルトに戻るオプションを保持します。これはおそらく、使用を避けるには少し手間がかかりすぎますvirtualenv。これは、私が使用することを回避することを意味してきました。

于 2010-05-03T17:14:09.217 に答える
0

Buildout を使用して幸運に恵まれました。必要な卵とバージョンのリストを設定します。その後、Buildout はそれぞれのプライベート バージョンをダウンロードしてインストールします。すべての卵が既にインストールされているプラ​​イベートな「python」バイナリを作成します。ローカルの「nosetests」により、デバッグが容易になります。独自の関数でビルドを拡張できます。

欠点として、Buildout は非常に不可解な場合があります。「buildout -vvvv」をしばらく実行して、それが何をしているのか、そしてその理由を正確に確認してください。

http://www.buildout.org/docs/tutorial.html

于 2010-05-14T16:58:17.397 に答える
0

少なくとも Linux では、複数の python がかなりうまく共存できます。Python 2.4をさまざまなシステムのデフォルトにする必要があるCentOSシステムでPython 2.6を使用しています。Python 2.6 を別のディレクトリ ツリーにコンパイルしてインストールした (そして、適切な bin ディレクトリをパスに追加した) だけで、かなり簡単でした。次に、「python2.6」と入力して呼び出します。

個別の Python を起動して実行したら、特定のバージョンのライブラリをインストールするのは簡単です。必要な python で setup.py スクリプトを呼び出すと、その python に適したディレクトリにインストールされ、スクリプトは python 実行可能ファイル自体と同じディレクトリにインストールされ、呼び出されたときに正しい python が自動的に使用されます。

また、あまり多くのライブラリを使用しないようにしています。ライブラリ (scipy など) から 1 つまたは 2 つの関数だけが必要な場合、それらを自分のプロジェクトにコピーできるかどうかをよく確認します。

于 2010-05-18T00:25:34.570 に答える