當前位置: 首頁>>技術問答>>正文


重命名virtualenv文件夾而不會破壞它

, , ,

問題描述

我已經創建了文件夾並在其中初始化了virtualenv實例。

$ mkdir myproject
$ cd myproject
$ virtualenv env

當我運行(env)$ pip freeze時,它會顯示已安裝的軟件包。

現在我想將myproject/重命名為project/

$ mv myproject/ project/

但是,現在我跑的時候

$ . env/bin/activate
(env)$ pip freeze

它說pip沒有安裝。如何在不破壞環境的情況下重命名項目文件夾?

最佳解決思路

您需要調整安裝以使用相對路徑。 virtualenv為此提供了--relocatable選項。來自the docs

Normally environments are tied to a specific path. That means that you cannot move an environment around or copy it to another computer. You can fix up an environment to make it relocatable with the command:

$ virtualenv –relocatable ENV

NOTE: ENV is the name of the virtual environment and you must run this from outside the ENV directory.

This will make some of the files created by setuptools or distribute use relative paths, and will change all the scripts to use activate_this.py instead of using the location of the Python interpreter to select the environment.

Note: you must run this after you’ve installed any packages into the environment. If you make an environment relocatable, then install a new package, you must run virtualenv –relocatable again.

次佳解決思路

我相信”knowing why”比”knowing how”更重要。所以,這是解決這個問題的另一種方法。

當您運行. env/bin/activate時,它實際執行以下命令(例如,使用/tmp):

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

但是,您剛剛將myproject重命名為project,因此該命令無法執行。這就是為什麽說pip is not installed,因為你沒有在係統中的全球環境安裝pip和你的virtualenv pip沒有正確來源。

如果要手動修複此問題,可以采用以下方法:

  1. 使用您喜歡的編輯器如Vim,通常在第42行修改/tmp/project/env/bin/activateVIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. 修改第1行中的/tmp/project/env/bin/pip#!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

之後,再次激活您的虛擬環境env,您將看到您的pip再次返回。

第三種解決思路

注意:作為@jb。指出,此解決方案僅適用於輕鬆(重新)創建的virtualenv。如果環境需要幾個小時才能安裝,則不建議使用此解決方案


Virtualenvs很棒,因為它們易於製作和轉換;它們使您無法鎖定單一配置。如果您了解項目要求,或者可以獲得它們,請創建一個新的virtualenv

  • 創建requirements.txt文件(env)$ pip freeze > requirements.txt

    • 如果無法創建requirements.txt文件,請在刪除原始env之前檢查env/lib/pythonX.X/site-packages

  • 刪除現有的(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

第四種思路

我總是安裝virtualenvwrapper來幫忙。從shell提示符:

pip install virtualenvwrapper

virtualenvwrapper文檔中記錄了一種方法 – cpvirtualenv這就是你要做的。確保您不在環境中並返回shell提示符。使用所需名稱鍵入:

cpvirtualenv oldenv newenv

然後,如有必要:

rmvirtualenv oldenv

要去你的新人:

workon newenv

第五種思路

您可以按照以下步驟解決問題:

  1. 重命名您的目錄

  2. 重新運行:$ virtualenv ..\path\renamed_directory

  3. virtualenv將糾正目錄關聯,同時保留您的包

  4. $ scripts/activate

  5. $ pip freeze驗證您的包裹是否到位

  6. 一個重要的警告,如果你的virtualenv目錄中的腳本文件中有任何靜態路徑依賴,你將不得不手動更改它們。

第六種思路

virtualenv-clone:另一種方法,它可以幫助我很多次沒有問題。

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env

第七種思路

(項目文件夾內)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

不要忘記停用並激活

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/6330.html,未經允許,請勿轉載。