我可以移动virtualenv吗?


89

这个问题不是重复的。

它不仅与重命名虚拟环境有关,而且与实际移动有关。其到其他目录(可能包括其他用户的目录)有关。

这与仅重命名虚拟环境不同,尤其是对不熟悉虚拟环境的人。

如果创建了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中进行操作,还是只需要吸收并克隆它。

可我只是mv一个virtualenv喜欢,没有悲伤?我确实想避免悲伤。

Answers:


69

是。可以在同一平台上移动它。您可以使用--relocatable在现有环境中使用。

来自--help

--relocatable-使现有的virtualenv环境可重定位。这样可以修复脚本并使所有.pth文件相对。

但是,这似乎并没有更改activate脚本,而只是更改了pip*easy_install*脚本。在activate脚本中, $VIRTUAL_ENV环境变量被硬编码为original /path/to/original/venv。该$VIRTUAL_ENV变量用于设置PATH你的活动环境中也是如此,所以它必须根据新的位置,以调用改变pythonpip等没有绝对路径。

要解决此问题,您可以$VIRTUAL_ENVactivate脚本中更改环境变量(例如,使用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上尝试了此操作,错误列出了目录中的所有脚本(* .py,*。bat,*。ps1)Scripts(相当于bin* nix上的内容),并说了一些类似activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.的内容,即抱怨文件中的哈希爆炸标头不是当前的virtualenv的python.exe,而是我从-easy修复的文件。我看着那个豪华的脚本,无论如何它已经发现了自己的路径-很好。其他一些脚本也都不依赖路径(例如deactivate.bat),因此简而言之,它可以工作。
达沃斯

2
@NathanBasanese该消息activate.ps1 cannot be made relative可以忽略,因为该脚本已经是相对的。该消息在Windows中没有帮助,因为脚本没有#!像Linux中那样使用指令来告诉Shell哪个应用程序应执行该指令。在activate.bat没有得到修改,但它不使用(至少在Windows 10,调用activate启动POSH脚本),所以不,我没有需要修改任何脚本。问题是pip.exe,它确实有一条经过python硬编码的路径,并且需要使用十六进制编辑器进行编辑,或者只需重新安装即可。
达沃斯

3
回想一下@Sgedda,我会说不要这样做。您的python环境应该使用最少pip freeze的需求文件就可以轻松地重新创建,因此您可以轻松地重新安装所有软件包,docker(与上面安装的virtualenv一起很好地工作),conda,pyenv或其他一些工具。您应该能够将环境创建和销毁为不变的基础架构,它们不应该是宝贵的。
达沃斯

15

对于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. pypy -3.7类似的功能(目前仅适用于Windows 3.3和Windows的Windows Python启动器
  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或命令行,不能百分百确定。

现在创建一个新的虚拟环境,然后添加旧环境的依赖关系。

  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

问题(我要解决的问题)是我想在不允许网络流量出现点(或几乎任何地方)的机器上运行python脚本。我可以在上面放文件,但不能和点子说话。可以肯定的利基案例,但这正是为什么我需要移动这些东西的原因。
理查德·拉斯特

@RichardRast这是一个不同的问题,我只是在回答原始问题。注:有您的问题的解决方案(下载包的拉链和本地安装,运行防火墙等后面的PyPI镜像服务器),但是这是不正确的:Q&A对于..
LightCC

2
您可以使用所有软件包创建轮子pip wheel . -w wheels,然后使用pip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8

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,因此而悲伤。

希望mvvirtualenv和使用它,否则未经修改的?

简短答案:

我让Boromir说出来,这样他就可以说清楚了:

好吧,你不能


2
除非您想获得血腥感并对其进行适当的修改,否则:bin中二进制文件中的链接会导致运动问题。如果您知道来自何处,则可以使用诸如find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;假设bin和lib位于当前venv文件夹中的方法。我用它作为一种快速而肮脏的方式来复制和移动安装了许多pip包的python3虚拟环境。
Paul Whipp '18

1
@PaulWhipp使用该命令与仅使用该命令相比有什么好处--relocatable吗?另外,内森,很好的问题,但这是一个可怕的答案。除非您的回答写得好并且清楚地列举了选项,否则接受您自己的答案总是会有一点偏颇,但要确定您自己还是主观的。
达沃斯

1
@Davos --relocatable对我不起作用,但是我经常通过破解二进制文件来移动python3 venvs,到目前为止,我还没有遇到任何问题。
保罗·惠普

1
我是在暗示您应该更改接受的答案,以换一个不同的答案(即不是您的答案)也许是人们选择的答案:D
达沃斯

3
问题是“我可以简单地mv通过venv吗?”,答案是“不,您不能简单地mv,有解决方法,但重新安装可能会更容易”。如果这是最佳答案,它将为我和其他人节省一些时间。
Nickolay '18年

5

是的,如果您还没有执行任何取决于virtualenv当前目录的操作,那应该可以实现。

但是,如果可以选择,最好的办法是创建新的virtualenv并开始使用新的virtualenv。这是最安全的选择,最不可能在以后引起问题。

该文档确实提到

每个virtualenv都将路径信息硬编码到其中,

例如,如果您已运行,则运行setvirtualenvproject后它将无法切换到正确的目录,workon ...因此在这种情况下,您需要手动进行修复。

通常,virtualenv只是一个目录,其中包含必要的Python解释器文件以及所需的软件包。


2

使用有关类似主题的本主题和其他主题的答案,我制作了一个bash脚本,该脚本位于virtualenv目录本身中在其内部执行,将有助于您的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

希望对您有所帮助。


0

是的你可以!(在windows

解决方法很简单,只需将虚拟环境移到任何地方,然后activate.bat在内部进行编辑scripts\

  1. 移至虚拟环境至所需目录

  2. 右键单击并编辑activate.bat位于venv_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


更改old_directoryold_directory-是错字吗?
确认

aww damn,是的,这是谢谢你
kyle olodin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.