virtualenvを移動できますか?


93

この質問は重複していません。

これは、仮想環境の名前変更するだけでなく、実際には別のユーザーのディレクトリを含む別のディレクトリに移動することにも関係します。

これは、特にvirtualenvに慣れていない人にとっては、単に仮想環境の名前を変更することと同じではありません。

virtualenvを作成し、それを別のフォルダーに移動しても、引き続き機能しますか?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

...その日遅く、仮想環境が移動しました...

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/

質問:

これは機能しますか?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas

私はこれを、これを試すことの知恵についての質問ではなく(もちろん、その知恵がユーモラスでない限り)、それが可能かどうかについての質問ではないことを意味します。Python 3で実行できるかどうか、またはそれ吸い上げてクローンを作成する必要があるかどうかを本当に知りたいです。

することができます私だけの悲しみのないような?悲しみは避けたいです。mvvirtualenv

回答:


70

はい。同じプラットフォーム上で移動することが可能です。--relocatable既存の環境で使用できます。

差出人--help

--relocatable-既存のvirtualenv環境を再配置可能にします。これにより、スクリプトが修正され、すべての.pthファイルが相対的になります。

ただし、これはactivateスクリプトを変更するようには見えず、スクリプトpip*easy_install*スクリプトのみを変更します。ではactivate、スクリプト、 $VIRTUAL_ENV環境変数は、元のようにハードコード/path/to/original/venv$VIRTUAL_ENV変数を設定するために使用されPATH、それが呼び出すために、新しい場所に基づいて変更されなければならないので、あまりにも、あなたのアクティブな環境のをpythonpip絶対パスなしなど。

この問題を修正するに$VIRTUAL_ENVは、activateスクリプト内の環境変数を変更できます(たとえば、を使用してsed)。これですべてがうまくいくはずです。

使用例:

$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass
...
(my-venv) $ python 
[...]
> import foass

Hooray、これで、インストールして、新しく配置した仮想環境にロードできます。


//、うーん。これは実際にはこれらを再配置可能にすることにはならないようです。それらが「通常の」スクリプトファイルではないというエラーが発生し続けます。
Nathan Basanese 2015

7
「--relocatableオプションには現在多くの問題があり、すべての状況で機能することが保証されているわけではありません。このオプションはvirtualenvの将来のバージョンで非推奨になる可能性があります。」(私の強調)ユーザーガイドを
BobTuckerman

1
私はこれをWindowsで試しましたが、エラーはScriptsdir(bin* nixと同等)にすべてのスクリプト(* .py、*。bat、*。ps1)をリストし、activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.基本的にファイル内のハッシュバンが文句を言っているようなものです。ヘッダーは現在のvirtualenvのpython.exeではなく、-easyfixedから移動したものです。私はその洗練されたスクリプトを調べましたが、とにかくそれはすでに独自のパスを発見しています-いいですね。他のスクリプトのいくつか(deactivate.batなど)もパスに依存しないため、要するにこれは機能します。
ダボス

2
@NathanBasaneseactivate.ps1 cannot be made relativeそのスクリプトはすでに相対的であるため、メッセージは無視できます。スクリプトは#!Linuxのようにディレクティブを使用して、どのアプリケーションがメッセージを実行するかをシェルに指示しないため、このメッセージはWindowsでは役に立ちません。activate.bat変更されませんが、それは(呼び出し、少なくとも窓10に使用されていないactivate何も私が編集に任意のスクリプトを必要としませんでしたので、POSHスクリプト起動を)。問題はpip.exe、ハードコードされたpythonへのパスがあり、16進エディターで編集するか、再インストールする必要があることです。
ダボス

3
@Sgedda振り返ってみると、これはしないでください。Python環境は、少なくともpip freeze要件ファイルを使用して簡単に再作成できる必要があります。これにより、すべてのパッケージ、docker(virtualenvがインストールされている場合に適切に機能します)、conda、pyenv、またはその他のツールを簡単に再インストールできます。不変のインフラストラクチャとして環境を作成および破棄できる必要があります。貴重なものであってはなりません。
ダボス

19

Python 3.3以降の場合(新しいvenv組み込みモジュールを使用)

短い答え(バージョンに関係なく):

  • 仮想環境を移動するためのクリーンで直接的な方法はありません
  • 再現するだけで簡単!


長い答え:

Python v3.3以降、virtualenvはという名前の組み込みモジュールになりましたvenv

--relocatable他の回答に記載されたオプションは、に含まれていなかったvenv、と現時点では良い、私はどちらかの名前を変更するの承知しているか、Pythonの仮想環境を再配置することを安全な方法はありません。

ただし、現在インストールされているすべてのパッケージを使用して、仮想環境を単純に再作成する非常に簡単な方法があります。参照してください、この答えを、または仮想環境を再作成の詳細については、以下のセクションを参照してください。プロセス中に、任意の場所で任意の名前で新しい環境を再作成できます。または、プロセスについては以下のセクションを参照してください。

その回答の中で、彼は直接の名前変更または移動をサポートする可能性のある他のいくつかのサードパーティパッケージについて言及しています。仮想環境をそのまま移動する方法を追求することに決心している場合は、それらが機能するかどうかを調べることができますvenv

注:その回答ではvirtualenv、ではなく、に焦点を当てていvenvます。翻訳方法については、以下を参照してください。



venv対古いvirtualenvコマンド構文

使用するコマンドvenvは次のとおりです。

python -m venv

virtualenv元のパッケージにコマンドとしてインストールされるだけでなく、「python」とは、Python実行可能ファイルを実行することを指します。これは、次のようなさまざまなものである可能性があります。

  1. python
  2. pyまたはpy -3.7または同様のもの(現時点では、Python3.3以降およびWindows用のWindowsPythonランチャー
  3. python3 (Python 2と3をデュアルインストールするLinux環境の規則)
  4. 問題が発生した場合は、実行するPython実行可能ファイルへの絶対パスを使用してください。 c:\program files\python37\python.exe

実行されているバージョンがわからない場合は、いつでもpython --version確認できます。



仮想環境を再作成する方法

仮想環境の作成/再作成は簡単であり、少し作業した後は第二の性質になるはずです。このプロセスは、前半にスクリプトをパッケージとして(依存関係を含めて)配布するために行うことと、その後の開発のためにスクリプト/パッケージをインストールするために誰かが行うことを反映しています。

まず、仮想環境にあるものの更新されたリストを取得します。アクティブにした状態で、使用するPythonバージョンを取得し、依存関係のリストをファイルに保存します。

  1. python --version仮想環境をアクティブにして使用し、使用しているPythonのバージョンを確認します。

    • これは明確にするためです-さまざまな理由でPythonバージョンを更新する必要があるかもしれません-少なくとも最新のパッチバージョンに
    • たとえば、既存のvenvがPython v3.7.4を使用しているが、現在v3.7.6がリリースされている場合は、代わりにv3.7.6を使用します。これには、セキュリティとバグの修正が含まれている必要があります。
  2. 使用するpython -m pip freeze > requirements.txt現在のパッケージの依存関係のリストを作成し、に入れrequirements.txtたファイル。このコマンドは、LinuxまたはGit Bashで確実に機能します。WindowsのPowershellまたはコマンドラインについては100%確実ではありません。

次に、新しい仮想環境を作成してから、古い環境からの依存関係を追加します。

  1. 新しいvenvを作成します。

    • venvにインストールする正しいバージョンのPythonを使用していることを確認してください。
    • まったく同じPythonバージョンにしたい場合:
      • 現在の仮想環境から(アクティブ化された状態で)Pythonを直接実行pythonし、コマンドとして使用するだけです
      • またはpython.exe、仮想環境フォルダー内で絶対パスを使用します
    • コマンドの新しいvenvフォルダーエントリの場合:
      • 目的の最終フォルダの場所に絶対パスまたは相対パスを追加します。
      • python -m venv my_new_venv新しいmy_new_venvフォルダの現在の作業ディレクトリに新しい仮想環境を作成するために使用します。
      • venvフォルダーの名前は、venvの名前(アクティブ化されたときにプロンプ​​トに表示される名前)になります。
  2. requirements.txtファイルから依存関係をインストールします。

    • python -m pip install -r requirements.txt

開発モードのローカルパッケージを再インストールする必要がある場合があります。

パッケージがインストールされている特定の場所を確認する必要がある場合は、次を使用してください。

  • python -m pip list -v
  • -vまたは「冗長」オプションは、それがインストールされているパスを含むインストールされている各パッケージに関するいくつかの情報を追加します。これは、まっすぐあなたが維持している仮想、ユーザー、およびシステムインストールパッケージを作成するのに便利です。

この時点で、古いvenvフォルダーとすべてのコンテンツを削除できます。そのためにGUIを使用することをお勧めします。ファイルの削除はLinuxコマンドラインから永続的に行われることが多く、小さなタイプミスは悪いニュースになる可能性があります。


venv pipの状態をコピーする方法はありませんか?つまり、pipを使用してすべてのライブラリを再ダウンロードする必要はありませんか?
Aydo

あなたが望む理由はわかりません-それはインターネットの帯域幅が極端に低い状況によるものですか、それとも大量に複製する必要があるためですか?pypiからすべてのzipを取得してローカルにインストールできると思いますが、私はそれに精通していません。パッケージをホストするためにローカルpipサーバーをセットアップできることを私は知っています。
LightCC

(私が解決しようとしている)問題は、ネットワークトラフィックがpipすることを許可しないマシン(またはほとんどどこでも)でPythonスクリプトを実行したいということです。ファイルを置くことはできますが、pipと話すことはできません。確かにニッチなケースですが、まさに私がこれらのものを動かす必要がある理由です。
リチャードラスト

@RichardRastそれは別の問題です、私は元の質問に答えているだけです。注:問題の解決策はありますが(パッケージをzipとしてダウンロードしてローカルにインストールする、ファイアウォールの背後でPyPiミラーサーバーを実行するなど)、これは正しくありません:Q&A ..
LightCC 2010年

2
を使用してすべてのパッケージからホイールを作成しpip wheel . -w wheels、次のpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
コマンドを使用

7

--relocatable引数virtualenvは、これを可能にするように見えます。


//、これは相対パスに依存しているだけですか、それとも他の方法でサルですか?
Nathan Basanese 2015

1
--relocatableは、既存の仮想環境でのみ機能します。virtualenv --relocatable my-python-venv環境がすでに存在した後に実行します。
hilcharge 2015

1
から--helpThis fixes up scripts and makes all .pth files relative。いいえ、プラットフォームに依存しないライブラリを作成するつもりはありません。別のプラットフォームに移動する場合は、ローカルのPythonに基づいて再インストールする必要があります。
hilcharge 2015

5
python3 venvモジュールはこのフラグをサポートしていません
Nelson

7

しかし悲しいかな:

いいえ、単純にできませんmv。回避策はありますが、再インストールする方が簡単な場合があります。

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$ 

...enter欲求不満を強く押し、以下の作品

$
$
$ pip3 search foaas

それがからではないことを除いてmy-python-venv、エルゴの悲しみ。

mvあなたにvirtualenvそれを使用したい、そうでなければ変更されていない?

簡潔な答え:

ボロミアに言わせて、彼がそれを明確にできるようにします。

まあ、あなたはできません


2
ひどくなり、適切に変更したい場合を除いて、移動の問題を引き起こすのは、ビン内のバイナリ内のリンクです。どこから来たのかがわかっている場合はfind bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;、binとlibが現在のvenvフォルダーにあると想定するようなものを使用できます。私はこれを、たくさんのpipパッケージがインストールされているpython3仮想環境をコピーして移動するための迅速で汚い方法として使用します。
ポールホイップ2018

1
@PaulWhipp単に使用するよりも、そのコマンドを使用することに利点はあります--relocatableか?また、ネイサン、素晴らしい質問ですが、これはひどい答えです。あなた自身の答えを受け入れることは、それがよく書かれていてオプションを明確に列挙していない限り、常に少し偏っていますが、とにかくあなた自身が主観的であると判断します。
ダボス

1
@Davos --relocatableは私には機能しませんでしたが、バイナリをハッキングすることでpython3 venvを定期的に移動しており、これまでのところ問題は発生していません。
ポールホイップ2018年

1
私はあなたが受け入れられたものを別の(つまりあなたのものではない)答えに変えるべきだとほのめかしていましたおそらく人々によって選ばれたもの:D
ダボス

3
質問は「単純mvにvenvを使用できますか?」であり、答えは「単純mvに実行できない、回避策はありますが、再インストールする方が簡単な場合があります」です。これが一番の答えだったとしたら、私や他の人たちの時間を節約できるでしょう。
ニコライ2018年

5

はい、これは、virtualenvの現在のディレクトリに依存することを何もしていない場合に可能になるはずです。

ただし、選択肢がある場合は、新しいvirtualenvを作成し、代わりに新しいvirtualenvの使用を開始するのが最善の方法です。これは最も安全な選択であり、後で問題を引き起こす可能性が最も低くなります。

ドキュメントには次のことが記載されています:

各virtualenvには、パス情報がハードコードされています。

たとえば、setvirtualenvproject実行workon ...した場合、実行後に正しいディレクトリに切り替えることができないため、その場合は手動で修正する必要があります。

一般に、virtualenvは、必要なPythonインタープリターファイルと必要なパッケージを含むディレクトリにすぎません。


3

同様のトピックに関するこのスレッドと他のスレッドの回答を使用して、virtualenvディレクトリ自体の中に配置して実行するbashスクリプトを作成しました。これはvirtualenvの移動に役立ちます。

その後、ディレクトリを移動するたびに変数virtualenv --relocatable yourenvを変更する必要があるVIRTUAL_ENVため、手動で変更したくない場合は、これを使用してください。

#!/bin/bash \n 
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)  
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate

お役に立てば幸いです。


1

はい、できます!(でwindows

回避策は簡単です。仮想環境を任意の場所に移動してから、activate.bat内部を編集するだけscripts\です。

  1. 仮想環境の目的のディレクトリに移動します

  2. を右クリックして編集activate.batvenv_folder\scriptsます。

  3. VIRTUAL_ENV変数を次から変更します。

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. 編集したバッチファイルを保存すれば、それだけです。

注:私のソリューションが動作して保存する必要がありwindows users、新たな仮想環境をセットアップ、私はので、これは他のオペレーティングシステムでは動作しないだろう.batからですMS-DOS


1
変更old_directoryにはold_directory-タイプミスということでしょうか?
ACK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.