virtualenvでPythonをアップグレードする


206

virtualenvで使用されているpythonのバージョンをアップグレードする方法はありますか(バグ修正リリースが出た場合など)?

pip freeze --local > requirements.txtディレクトリを削除してから削除することもできpip install -r requirements.txtますがnumpy、これにはたとえば、私が頻繁に使用する大きなライブラリの再インストールが大量に必要になります。

これは、例えば2.6-> 2.7からアップグレードするときに利点があることがわかりますが、2.7.x-> 2.7.yはどうですか?


2
一部のパスなどを変更して機能させることができる場合があります。最後に必要なのは、本番環境とは少し異なる環境です。考えてみてください。さまざまなバージョンのコンパイル方法に1つでも違いがある場合は、バグを追跡することで節約された時間をすべて失うことになります。時間をかけて、まったく新しいvirtualenvを作成し、すべてを再インストールします。
Sam Dolan

@サイモンウォーカー。まったく同じ問題。バグ修正のためにpython 3.5.3をアップグレードする必要があります。
Mohammed Shareef C

回答:


77

これを見ましたか?その答えを誤解していない場合は、古い仮想環境の上に新しい仮想環境を作成してみてください。どのpythonがvirtualenvを使用するかを知る必要があるだけです(virtualenvのバージョンを確認する必要があります)。

virtualenvが古いものと同じpythonバージョンでインストールされており、virtualenvパッケージのアップグレードがオプションではない場合、必要なpythonバージョンでvirtualenvをインストールするためにこれを読むことができます。

編集

私はこのアプローチ(古いものの上に新しいvirtualenvを作成するもの)をテストしましたが、うまくいきました。私はあなたがpython 2.6から2.7または2.7から3.xに変更するといくつかの問題があるかもしれないと思いますが、同じバージョン内でアップグレードするだけなら(あなたが望むように2.7のままで)、すべてのパッケージとして問題はないはずです両方のpythonバージョンの同じフォルダーに保持されます(2.7.xおよび2.7.yパッケージはyour_env / lib / python2.7 /内にあります)。

virtualenv pythonのバージョンを変更する場合は、そのバージョンのすべてのパッケージを再度インストールする必要があります(または、必要なパッケージを新しいバージョンのパッケージフォルダーにリンクするだけです:your_env / lib / python_newversion / site-packages)。


13
特に、可能であればパッケージを再インストールしたくありませんでした。どうしてそれが重要なのかわからなければ、ソースからnumpyをインストールしたことがないことは明らかです;)ヒント:LOOOOOOOOOOOOOONG時間かかります。
Antti Haapala 2012年

ええ、私はそれを理解しています。しかし、virtualenvを他の上位に配置した場合、パッケージは失われないため、numpyまたはその他のパッケージを再インストールする必要はないようです。それにもかかわらず、私は彼が失敗した場合に備えて、新しいvirtualenvでこれを試すべきだと思います。
marianobianchi 2012年

私の場合は休憩します。新しいvirtualenvバージョンは確かに適切にアップグレードされると思いますが、古いバージョンでは、Python実行可能ファイルを上書きすることさえなかったため、少なくとも1つのPythonバグ修正リリースで問題が発生しました。
Antti Haapala

4
それは私にとってはうまくいき
Kentzo

1
virtualenv古いものの上に新しいものを作成してみましたが、うまくいきました。-p正しいバージョンのpythonを指すように指定する必要がありました。
osa

76

Python 3.3以降に付属のvenvモジュールを使用している--upgrade場合は、オプションがサポートされています。ドキュメントごと:

Pythonがインプレースでアップグレードされていることを前提として、このバージョンのPythonを使用するように環境ディレクトリをアップグレードします。

python3 -m venv --upgrade ENV_DIR

1
残念ながら、これはUbuntu 16.04では機能せずvenv、「virtualenvを使用できる」という理由で壊れて修正を拒否しました。編集:実際には、機能します!また、「ensurepip」に関するエラーメッセージも表示されます。
rspeer

2
システムでpythonを3.5.1から3.6.4にアップグレードしました。そして、私のvirtualenvの上のpythonをアップグレードするために、私は明示的にコマンドでpython3.6に言及しなければならなかった:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraazアハメド

1
私の場合、bin/pythonおよびbin/python3古いにリンクされpython3.4たバイナリ、と私はリンクを手動で設定する必要がありました。また、古いPythonバージョンを削除する方法はありますか?
イェンス

4
私が得たError: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.、それが何を意味しますか>?アクティブなpythonプロセスがないため、アップグレードできません。
user305883 2018年

1
@ user305883システムのPythonバージョンを3.5から3.6にアップグレード(および3.5を削除)した後、同様のエラーが発生しました。3.5を再インストールして実行python3.6 -m venv --upgrade ENV_DIRする必要がありました。私はまだいくつかのシンボリックリンクを更新する必要があると思いますENV_DIR/bin。したがって、トリックは、古いバージョンがまだインストールされている間に新しい Pythonバージョンで更新することでした。
AstroFloyd

24

再度更新: 次のメソッドは、virtualenvの新しいバージョンでは機能しない可能性があります。古いvirtualenvに変更を加える前に、依存関係を要件ファイル(pip freeze > requirements.txt)に保存し、別の場所にバックアップを作成する必要があります。何か問題が発生した場合でも、新しいvirtualenvを作成して古い依存関係をインストールできます(pip install -r requirements.txt)。

更新:最初に回答してから5か月後に回答を変更しました。次の方法は、より便利で堅牢です。

副作用: Pythonをv2.7.8にアップグレードした後に仮想環境でSymbol not found: _SSLv2_method実行import sslした場合の例外も修正されます。

注意:現在、これはPython 2.7.x専用です。


deactivateOSXでHomebrew Pythonを使用している場合は、最初にすべてのvirtualenvを実行してから、Pythonをアップグレードします。

brew update && brew upgrade python

次のコマンドを実行します(<EXISTING_ENV_PATH>は仮想環境のパスです)。

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

最後に、仮想環境を再作成します。

virtualenv <EXISTING_ENV_PATH>

そうすることで、古いPythonコアファイルと標準ライブラリ(プラスsetuptoolspip)は削除されますが、インストールされたカスタムライブラリsite-packagesは、純粋なPythonになるとすぐに保存されて機能します。バイナリライブラリは、正しく機能するために再インストールする必要がある場合とない場合があります。

これは、Djangoがインストールされた5つの仮想環境で動作しました。

ところで、./manage.py compilemessages後で機能しない場合は、これを試してください:

brew install gettext && brew link gettext --force

私が削除しなければならなかった唯一のファイルはbin/pythonファイルでした。
公園。

一部の古いバージョンのためにPythonは、削除setuptoolsしてpip必要です。
Rockallite 2016

1
<EXISTING_ENV_PATH>/.Pythonvirtualenvの作成が壊れたため、削除する必要もありました。
キランジョナラガッダ2016年

2
この回答に基づいて、私は(フル帰属して)小さなスクリプトを書いた:burgundywall.com/post/update-all-python-virtual-environments
クルト・

実際に仮想環境を実行することで簡単に削除できrmvirtualenv <env_name>、そのすべての依存関係が削除されます:)詳細は、virtualenvwrapper.readthedocs.io
Nick Lucas

7

古い仮想環境の上に新しい仮想環境を作成することができませんでした。しかし、pipには、要件を新しいvenvに再インストールするのをはるかに高速にするツールがあります。Pipは、requirements.txtの各項目をwheelパッケージに構築し、ローカルキャッシュに格納できます。新しいvenvを作成し、その中でpip installを実行すると、pipは事前に作成されたホイールを検出すると、自動的にそれを使用します。ホイールは、各モジュールに対してsetup.pyを実行するよりもはるかに速くインストールされます。

私の〜/ .pip / pip.confは次のようになります:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

ホイール(pip install wheel)を取り付けて実行しpip wheel -r requirements.txtます。これにより、構築されたホイールが私のpip.confのwheel-dirに保存されます。

それ以降、これらの要件のいずれかをpipインストールするときはいつでも、ホイールからインストールされます。これは非常に迅速です。


1
ほとんどの人にとって、pip機械を使用して作業を行うのは理にかなっていると思いますが、virtualenvをpostactivate、predeactivateなどにカスタマイズした人にとって、これはすべて失われて手動で読み取る必要があるため、望ましいオプションではありません。
dpwrussell

6

既存のvirtualenvwrapperプロジェクトのPythonバージョンをアップグレードし、同じ名前を維持する方法

Doug Hellmannの優れたvirtualenvwrapperを使っている人のために、既存の回答ではうまくいかなかったので、回答を追加します。

いくつかのコンテキスト:

  • 私はPython 2のプロジェクトとPython 3のプロジェクトに取り組んでいます。を使用したいのですがpython3 -m venv、Python 2環境をサポートしていません
  • 新しいプロジェクトを開始するときにmkproject、仮想環境を作成し、空のプロジェクトディレクトリを作成して、そこにcdします。
  • workonPythonのバージョンに関係なく、virtualenvwrapperのコマンドを引き続き使用してプロジェクトをアクティブ化したい

行き方:

既存のプロジェクトに名前が付けられfoo、現在Python 2(mkproject -p python2 foo)を実行しているとしましょう。ただし、2.xから3.x、3.6.0から3.6.1にアップグレードする場合でもコマンドは同じです。また、現在、アクティブ化された仮想環境内にあります。

1.古い仮想環境を非アクティブ化して削除します。

$ deactivate
$ rmvirtualenv foo

フックにカスタムコマンドを追加した場合(例bin/postactivate:)、環境を削除する前にそれらを保存する必要があることに注意してください。

2.実際のプロジェクトを一時ディレクトリに隠します:

$ cd ..
$ mv foo foo-tmp

3.新しい仮想環境(およびプロジェクトディレクトリ)を作成し、アクティブ化します。

$ mkproject -p python3 foo

4.空の生成されたプロジェクトディレクトリを実際のプロジェクトに置き換え、プロジェクトディレクトリに戻します。

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5.依存関係を再インストールし、新しいPythonバージョンなどを確認します。

$ pip install -r requirements.txt
$ python --version

これが一般的なユースケースである場合は、PRを開いて、virtualenvwrapperに$ upgradevirtualenv/ などを追加すること$ upgradeprojectを検討します。


1
はい、お願いします。これを途中で行って大きな問題が発生しました...最初のステップは削除すると
元に戻せ

2

このアプローチは常に私にとってうまくいきます:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

から取られる:


1

私はホームディレクトリをあるMacから別のMac(Mountain LionからYosemite)に移動しましたが、古いラップトップを手に入れるまで、virtualenvが壊れていることに気付きませんでした。私はvirtualenvにPython 2.7をポイントさせてインストールしましたがbrew、YosemiteにはPython 2.7が付属していたため、virtualenvをシステムpythonに更新したいと思っていました。virtualenv既存のディレクトリの上で実行すると、OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'エラーが発生しました。試行錯誤で、いくつかのリンクを削除し、さらにいくつかを手動で修正することで、この問題を回避しました。これは私が最後にやったことです(@Rockaliteがやったことと似ていますが、より簡単です):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

この後、既存のディレクトリの上でvirtualenvを実行することができました。


1

OSXまたはmacOSでHomebrewを使用してPython3をインストールおよびアップグレードすると、機能する前にシンボリックリンクを削除するpython -m venv --upgrade ENV_DIR必要がありました。

以下をupgrade_python3.shに保存したので、もう一度実行する必要がある場合に、今から数か月後に覚えています。

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

更新:これは最初はうまく機能しているように見えましたが、py.testを実行したときにエラーが発生しました。最終的に、要件ファイルから環境を再作成しました。


py.test`〜/ .virtualenvs / myenv / bin / python3.7はシンボリックリンクではないため更新されません。
Ash Berlin-Taylor

ああ~/.virtualenvs/myenv/.Python、実際問題は、そこにシンボリックリンクがあります。
Ash Berlin-Taylor

1

を使用pipenvしている場合、環境をインプレースでアップグレードできるかどうかはわかりませんが、少なくともマイナーバージョンのアップグレードでは、新しい環境を作成するときにパッケージを最初から再構築しないので十分に賢いようです。例:3.6.4から3.6.5:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a virtualenv for this project
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv
Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47  00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

驚くばかり!この宝石をありがとう
Mayur Patil 2018

1

明確にしたいのは、いくつかの回答が参照しvenv、他の回答が参照しているためですvirtualenvです。

-pまたは--pythonフラグの使用は、virtualenvではサポートされていますが、ではサポートされていませんvenv。Pythonのバージョンが複数あり、どちらを作成するかを指定するvenv場合は、次のようにコマンドラインで実行します。

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

もちろんvenv、他の人が指摘したようにアップグレードできますが、それはvenvそもそもそれを作成するために使用されたPythonをすでにアップグレードしていることを前提としています。システムのどこかにまだないPythonバージョンにアップグレードすることはできないので、まず必要なバージョンを取得してから、必要なすべてのvenvを作成してください。


1

ステップ1:要件を凍結し、既存の環境のバックアップを取る

pip freeze > requirements.txt
deactivate
mv env env_old

ステップ2: Python 3.7をインストールして仮想環境をアクティブ化する

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

ステップ3:要件をインストールする

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

0

問題のあるすべての人のために

エラー:コマンド '[' / Users / me / Sites / site / venv3 / bin / python3 '、' -Im '、' ensurepip '、' --upgrade '、' --default-pip ']'がゼロ以外を返しました終了ステータス1。

python3.6-venvをインストールする必要があります

 sudo apt-get install python3.6-venv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.