重命名virtualenv文件夹而不会破坏它

Ril*_*ins 157 python ubuntu pip virtualenv

我已经创建了文件夹并在其中初始化了virtualenv实例.

$ mkdir myproject
$ cd myproject
$ virtualenv env
Run Code Online (Sandbox Code Playgroud)

当我运行时(env)$ pip freeze,它会显示已安装的软件包.

现在我想重命名myproject/project/.

$ mv myproject/ project/
Run Code Online (Sandbox Code Playgroud)

但是,现在我跑的时候

$ . env/bin/activate
(env)$ pip freeze
Run Code Online (Sandbox Code Playgroud)

它说pip没有安装.如何在不破坏环境的情况下重命名项目文件夹?

ire*_*ses 145

您需要调整安装以使用相对路径.virtualenv为此提供了--relocatable选项.来自文档:

通常,环境与特定路径相关联.这意味着您无法移动环境或将其复制到另一台计算机.您可以修复一个环境,使其可以使用以下命令进行重定位:

$ virtualenv - 可定位的ENV

注意: ENV是虚拟环境的名称,您必须从ENV目录外部运行它.

这将使一些由setuptools创建的文件或分发使用相对路径,并将更改所有脚本以使用activate_this.py而不是使用Python解释器的位置来选择环境.

注意:在将任何软件包安装到环境中之后,必须运行此命令.如果您使环境可重定位,然后安装新包,则必须再次运行virtualenv --relocatable.

  • --reocatable选项目前存在许多问题,并不保证在所有情况下都能正常工作.该选项可能会在virtualenv的未来版本中弃用.此外,这不会使您的包跨平台.您可以移动目录,但它只能在其他类似的计算机上使用. (6认同)
  • 此功能现已弃用。这个答案不再有效。 (4认同)
  • 警告:将env更改为可重定位不仅仅是让你移动文件夹.(参见*注释:*从文档中复制)......它可能有副作用. (2认同)
  • 此外,您还必须编辑virtualenvwrapper` .jects文件,其中包含依赖于virtualenv的源代码的路径,假设您使用的是virutalenvwrapper并且还重命名了项目目录以匹配新的virtualenv. (2认同)

hol*_*lys 103

我相信的是. env/bin/activate.所以,这是解决这个问题的另一种方法.

当你运行:

/tmp

它实际上执行以下命令:

(我测试了这个myproject)

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV
Run Code Online (Sandbox Code Playgroud)

但是,您刚刚重命名projectpip is not installed,因此命令无法执行.这就是为什么它说pip,因为你既没有安装 pip 在系统全局环境中也没有你的virtualenv /tmp/project/env/bin/activate正确采购.

如果您想手动修复此问题,那就是:

  1. VIRTUAL_ENV='/tmp/myproject/env'用你最喜欢的编辑器修改,比如Vim,通常在 VIRTUAL_ENV='/tmp/project/env'

    /tmp/project/env/bin/pip => #!/tmp/myproject/env/bin/python

  2. 修改#!/tmp/project/env/bin/pythonenv

    pip => . env/bin/activate

之后,/tmp再次激活您的虚拟环境,您将看到您myproject又回来了.

  • 如果需要手动更改路径,则应注意有两个以上的硬编码文件.用以下内容找到它们:`grep -iHnR venv-name/path/to/venv-name | grep -v"^二进制文件"| grep -i venv-name`.事实上,我注意到在我的一个Django实例中,很多软件包都有"Python sh-bang的路径". (5认同)
  • 知道为什么他们使用绝对路径而不是相对路径吗?像在 Windows 上使用 %~dp0 获取 bat 文件的父目录之类的东西肯定会让这更好吗? (2认同)

bnj*_*jmn 38

注意:作为@jb.指出,此解决方案仅适用于轻松(重新)创建的virtualenvs.如果环境需要几个小时才能安装,则不建议使用此解决方案


Virtualenvs很棒,因为它们易于制作和转换; 它们使您无法锁定单一配置.如果您了解项目要求,或者可以获得它们,请创建一个新的virtualenv:

  • 创建一个requirements.txt文件

    (env)$ pip freeze > requirements.txt

    • 如果无法创建requirements.txt文件,请env/lib/pythonX.X/site-packages在删除原件之前进行检查env.
  • 删除现有的 (env)

    deactivate && rm -rf env

  • 创建新的virtualenv,激活它并安装需求

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


或者,使用virtualenvwrapper使事情变得更容易,因为所有的virtualenvs都保存在一个集中的位置

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv
Run Code Online (Sandbox Code Playgroud)

  • 好吧,有些人`pip install -r requirements.txt`需要几个小时(在raspberry pi上编译第三方C扩展). (6认同)
  • 也许是真的,但这对我来说似乎是一个优势.我仍然认为这可能是许多案例的可行解决方案. (3认同)

Afr*_*ave 28

我总是安装virtualenvwrapper来帮忙.从shell提示符:

pip install virtualenvwrapper
Run Code Online (Sandbox Code Playgroud)

virtualenvwrapper文档中记录了一种方法 - cpvirtualenv 这就是你要做的.确保您不在环境中并返回shell提示符.使用所需名称键入:

cpvirtualenv oldenv newenv
Run Code Online (Sandbox Code Playgroud)

然后,如有必要:

rmvirtualenv oldenv
Run Code Online (Sandbox Code Playgroud)

要去你的新人:

workon newenv
Run Code Online (Sandbox Code Playgroud)


rya*_*yer 16

您可以按照以下步骤解决问题:

  1. 重命名您的目录
  2. 重新运行: $ virtualenv ..\path\renamed_directory
  3. virtualenv将纠正目录关联,同时保留您的包
  4. $ scripts/activate
  5. $ pip freeze 验证您的包裹是否到位
  6. 一个重要的警告,如果你的virtualenv目录中的脚本文件中有任何静态路径依赖,你将不得不手动更改它们.


Ant*_*ins 12

还有另外一种方法可以帮助我很多次没有问题的是virtualenv-clone:

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
Run Code Online (Sandbox Code Playgroud)


Ign*_*cio 8

在您的项目文件夹中运行它:

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *
Run Code Online (Sandbox Code Playgroud)

不要忘记停用和激活。