web-dev-qa-db-ja.com

virtualenvでpythonをアップグレードします

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

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

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

161
Simon Walker

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

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

編集

このアプローチ(古いアプローチの上に新しい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 -パッケージ)

61
marianobianchi

Python 3.3+に付属するvenvモジュールを使用している場合は、--upgradeオプションがサポートされています。 docs

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

python3 -m venv --upgrade ENV_DIR
48
CoupleWavyLines

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

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

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

注意:現在、これはPython 2.7.xのみ


OS XでHomebrew Pythonを使用している場合は、最初にdeactivate all 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
22
Rockallite

古い仮想環境の上に新しい仮想環境を作成することはできませんでした。しかし、pipには、新しいvenvに要件を再インストールするのをはるかに高速にするツールがあります。 Pipは、requirements.txtの各アイテムをホイールパッケージにビルドし、ローカルキャッシュに保存できます。新しい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

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

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

5
Russ Egan

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

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

コンテキスト:

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

行き方:

既存のプロジェクトの名前が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を開いて、$ upgradevirtualenv/$ upgradeprojectなどをvirtualenvwrapperに追加することを検討します。

4
Taylor Edmiston

Homebrewを使用してPython3をインストールおよびアップグレードするOS XまたはmacOSでは、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を実行するとエラーが発生しました。最後に、要件ファイルから環境を再作成しました。

1
Jeff C Johnson

答えの一部は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
Malik A. Rumi

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
>>>
1
David Moles

ホームディレクトリをあるMacから別のMac(Mountain LionからYosemite)に移動しましたが、古いラップトップを手に入れるまで壊れたvirtualenvに気付きませんでした。 brewによってインストールされたPython 2.7を指すvirtualenvがあり、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
haridsv

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

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

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

 Sudo apt-get install python3.6-venv
0
JanL