我可以移动virtualenv吗?

Nat*_*ese 57 python virtualenv python-3.x virtualenv-commands

这个问题不重复.

它不仅适用于重命名虚拟环境,还适用于其实际移动到其他目录,包括可能包含的其他用户目录.

这与仅重命名虚拟环境不同,特别是对于不熟悉virtualenvs的人.

如果我创建了一个virtualenv,并将其移动到另一个文件夹,它仍然可以工作吗?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 
Run Code Online (Sandbox Code Playgroud)

......当天晚些时候,虚拟环境MOVED ......

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/
Run Code Online (Sandbox Code Playgroud)

题:

这会有用吗?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas
Run Code Online (Sandbox Code Playgroud)

我的意思是,这不是一个关于尝试这个的智慧的问题(当然,除非这种智慧是幽默的),更多的是关于它是否可能.我真的想知道在Python 3中是否可以这样做,或者我是否只需要将其搞砸并克隆它.

我可以mvvirtualenv没有悲伤的情况下这样做吗?我确实想避免悲伤.

hil*_*rge 58

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

来自--help:

--reocatable - 使一个现有的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
Run Code Online (Sandbox Code Playgroud)

万岁,现在您可以安装并将其加载到新定位的虚拟环境中.

  • " - 可复制选项目前存在许多问题,并不能保证在所有情况下都能正常工作.**未来版本的virtualenv可能会弃用该选项.**"(强调我的)看到[用户指南](https://virtualenv.pypa.io/en/stable/userguide/#making-environments-relocatable) (6认同)
  • @NathanBasanese消息`activate.ps1无法成为相对`可以被忽略,因为该脚本已经是相对的.该消息在Windows中没有用,因为脚本不像Linux中那样使用`#!`指令来告诉shell哪个应用程序应该执行它.`activate.bat`没有被修改,但它没有被使用(至少在Windows 10上,调用`activate`启动PoSH脚本)所以我不需要编辑任何脚本.问题是`pip.exe`确实有一个python硬编码路径,需要使用十六进制编辑器进行编辑,或者只是重新安装. (2认同)
  • 回想一下@Sgedda,我会说不要这样做。您的python环境应该至少可以使用pip Frozen最小化到需求文件中,以便可以轻松地重新创建,以便您可以轻松地重新安装所有软件包,docker(可在其上安装virtualenv很好地使用),conda,pyenv或其他一些工具。您应该能够创建和销毁作为不变基础架构的环境,它们不应该是宝贵的。 (2认同)

Lig*_*tCC 37

对于 Python 3.3+(带有新的venv内置模块)

简答(不分版本):

  • 没有干净、直接的方法来移动虚拟环境
  • 只需重新创建,这很容易!!


长答案:

从 Python v3.3 开始,virtualenv已经成为一个名为venv.

--relocatable其他答案中提到的选项未包含在 中venv,目前我知道没有好的、安全的方法来重命名或重新定位 Python 虚拟环境。

但是,有一种相当简单的方法可以简单地重新创建一个虚拟环境,包括所有当前安装的包。请参阅此答案,或参阅以下部分以了解有关重新创建虚拟环境的信息。在此过程中,您可以在任何位置以您想要的任何名称重新创建新环境。或查看以下部分了解该过程。

在那个答案中,他确实提到了其他一些可能支持直接重命名或移动的 3rd 方软件包。如果您决定寻求一种完整地移动虚拟环境的方法,您可以研究这些方法是否也venv适用。

注意:在那个答案中,它侧重于virtualenv,而不是venv。有关如何翻译,请参见下文。



venv与较旧的virtualenv命令语法

要使用的命令venv是:

python -m venv
Run Code Online (Sandbox Code Playgroud)

而不仅仅是virtualenv,它作为命令安装在原始包中。其中“python”是指您运行 python 可执行文件的方式,这可能是多种情况,例如:

  1. python
  2. pypy -3.7或类似的(目前仅适用于 Python 3.3+ 和 Windows的Python Launcher for Windows
  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 - 不是 100% 确定 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 重新下载所有库? (6认同)
  • 问题(我试图解决)是我想在不允许网络流量 pip (或几乎任何地方)的机器上运行 python 脚本。我可以将文件放在上面,但它无法与 pip 通信。这确实是一个利基案例,但这正是我需要移动这些东西的原因。 (6认同)
  • 您实际上不必重新安装模块。对于我在“python3.9”中,我简单地再次运行“$ python3 -m venv new/path/to/virtenv”,它修复了路径。 (3认同)
  • 您可以使用“pipwheel”从所有包中创建轮子。-wwheels`,然后使用“pip install --no-index --find-links /path/to/wheels/ -rrequirements.txt”在新的虚拟环境中重新安装软件包 (2认同)

小智 7

这个--relocatable论点virtualenv似乎允许你这样做.

  • python3 venv模块不支持此标志 (3认同)

Mon*_*kos 7

是的你可以!(在windows

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

  1. 移动到虚拟环境到想要的目录

  2. 右键单击并编辑activate.bat位于venv_folder\scripts.

  3. 更改VIRTUAL_ENV变量:

     set VIRTUAL_ENV=C:\old_directory\venv_name
    
    Run Code Online (Sandbox Code Playgroud)

    进入

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存编辑后的批处理文件,就是这样!

注意:我的解决方案应该可以工作并保存windows users设置新的虚拟环境,我怀疑这是否可以在其他操作系统中工作,因为.bat来自MS-DOS


Sim*_*ser 6

是的,如果您没有做任何取决于virtualenv的当前目录的事情,这应该是可能的.

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

文档确实提到:

每个virtualenv都有硬编码的路径信息,

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

一般来说,virtualenv只不过是一个包含必要的Python解释器文件和所需包的目录.


Nat*_*ese 5

可惜:

不,你不能简单地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
$ 
Run Code Online (Sandbox Code Playgroud)

... enter沮丧无比,以下工作

$
$
$ pip3 search foaas
Run Code Online (Sandbox Code Playgroud)

除了不是来自my-python-venv,因此而悲伤。

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

简短答案:

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

好吧,你不能

  • 问题是“我可以简单地`MV` venv吗?”,答案是“不,您不能简单地`MV`,有解决方法,但重新安装可能会更容易”。如果这是最佳答案,它将为我和其他人节省一些时间。 (3认同)
  • 除非您想获得血腥感并对其进行适当的修改:导致移动问题的是bin中二进制文件中的链接。如果您知道从哪里来,可以使用`find bin -type f -exec ex -sc“%s,$ {FROM},$ {PWD},g | x” {} \;`之类的东西,假设您的bin和lib在您当前的venv文件夹中。我用它作为一种快速而又肮脏的方式来复制和移动安装了许多pip包的python3虚拟环境。 (2认同)
  • @PaulWhipp 使用该命令与仅使用“--relocatable”相比有什么好处吗?另外,内森,这是一个很好的问题,但这是一个糟糕的答案。接受你自己的答案总是有点偏见,除非它写得很好并且清楚地列举了选项,但无论如何确定你自己都是主观的。 (2认同)
  • @Davos --relocatable 对我不起作用,但我经常通过破解二进制文件来移动 python3 venvs,到目前为止我还没有遇到任何问题。 (2认同)