Win10 配置 Python 虚拟环境

Win10, Python3.7.9

前两周的算法设计实践周刚刚过去,用 django 写了个小工具 http://calc.yuhi.xyz,期间学习了使用 virtualenvwrapper-win 进行 python 虚拟环境管理,在此记录一下用法。

首先,安装 python3。可以在官网安装(记得配置环境变量),或者使用 scoop 进行安装。

以下操作在 powershell 下运行,或者你也可以使用 cmd

如果想要安装特定的版本,比如 python3.7.9,需要在 scoop 中添加名为 versionsbucket

1
scoop bucket add versions

然后安装 python3.7.9

1
scoop install python@3.7.9

接下来我们安装 virtualenvwrapper-win

1
pip install virtualenvwrapper-win

安装成功后我们就能创建虚拟环境了,执行 mkvirtualenv env4test 命令创建一个名为 env4testpython 虚拟环境。

mkvirtualenv env4test ◎ mkvirtualenv env4test

可以看到,默认会在 C:\Users\XXX\Envs\ 路径下,创建了一个 env4test 文件夹。

使用 lsvirtualenv 命令查看当前所有的虚拟环境:

lsvirtualenv ◎ lsvirtualenv

可以使用 rmvirtualenv env4test 删除该虚拟环境(这里就不删了)。

使用 workon env4test 命令激活该虚拟环境:

workon env4test ◎ workon env4test

以上成功进入虚拟环境 env4test。但 powershellworkon 命令并不能生效,而 cmd 下没有这个问题。

在 powershell 下 workon 命令无效解决方案

三种解决方案如下:

  1. cmd 下运行。

  2. 使用 ~\Envs\env4test\Scripts\activate.ps1 激活环境

    即进入该虚拟环境 Scripts 文件夹下,用 activate.ps1 激活

    activate.ps1

    ◎ activate.ps1

  1. powershell 重写 workon.ps1 脚本

    参考链接:workon command doesn't work in Windows PowerShell to activate virtualenv

    先找到原来的 workon 命令即 workon.bat 文件。我的在 python\3.7.9\Scripts 路径下。

    Script 文件夹下,只有 workon.bat 脚本,而没有 workon.ps1 脚本,前者执行时会调用 cmd 进行环境的激活,然后运行结束再回到 powershell,子进程并没有对父进程造成影响,因此在 powershell 并没有激活虚拟环境。

    在同目录下新建 workon.ps1 脚本,添加以下内容即可:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    if (-not (Test-Path env:WORKON_HOME))
    {
        $WORKON_HOME = '~\Envs'
    } else {
        $WORKON_HOME = ($env:WORKON_HOME).Replace('"','')
    }
    
    if (-not (Test-Path env:VIRTUALENVWRAPPER_PROJECT_FILENAME)) {
        $VIRTUALENVWRAPPER_PROJECT_FILENAME = '.project'
    } else {
        $VIRTUALENVWRAPPER_PROJECT_FILENAME = ($env:VIRTUALENVWRAPPER_PROJECT_FILENAME).Replace('"','')
    }
    
    if ($args.length -eq 0) {
        echo "Pass a name to activate one of the following virtualenvs:"
        echo ==============================================================================
        (Get-ChildItem -Path $WORKON_HOME).Name
        return
    }
    
    $VENV = $args[0]
    
    if (!(Test-Path -Path ("$($WORKON_HOME)\$($VENV)"))) {
        echo ("virtualenv $($VENV) does not exist")
        echo "Create it with 'mkvirtualenv $($VENV)'"
        return
    }
    
    if (!(Test-Path -Path ("$($WORKON_HOME)\$($VENV)\Scripts\activate.ps1") ))  {
        echo "$($WORKON_HOME)$($VENV)"
        echo "doesn't contain a virtualenv (yet)."
        echo "Create it with 'mkvirtualenv $($VENV)'"
        return
    }
    
    iex ("$($WORKON_HOME)\$($VENV)\Scripts\activate.ps1")
    
    if (Test-Path -Path ("$($WORKON_HOME)\$($VENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)")) {
        iex "cdproject"
    }
    

    然后新建 cdproject.ps1 脚本(不要改动原来的 cdproject.bat),添加以下内容:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    function Show-Usage {
        echo ""
        echo  "switches to the project dir of the activated virtualenv"
    }
    
    if (-not (Test-Path env:VIRTUAL_ENV)) {
        echo ""
        echo "a virtualenv must be activated"
        Show-Usage
        return
    }
    
    if (-not (Test-Path env:VIRTUALENVWRAPPER_PROJECT_FILENAME)) {
        $VIRTUALENVWRAPPER_PROJECT_FILENAME = '.project'
    } else {
        $VIRTUALENVWRAPPER_PROJECT_FILENAME = ($env:VIRTUALENVWRAPPER_PROJECT_FILENAME).Replace('"','')
    }
    
    if (-not (Test-Path "$($env:VIRTUAL_ENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)")) {
        echo ""
        echo "No project directory found for current virtualenv"
        Show-Usage
        return
    }
    
    $ENVPRJDIR = Get-Content "$($env:VIRTUAL_ENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)" -First 1
    
    # If path extracted from file contains env variables, the system will not find the path.
    # TODO: Add this functionality
    
    cd $ENVPRJDIR
    

    这样我们在 powershell 中使用 workon 命令或者是 cdproject 命令,都会使用 .ps1 脚本,而不是 .bat;而在 cmd 则是使用 .bat 脚本。

使用 deactivate 退出虚拟环境。

deactivate ◎ deactivate

本文只是介绍了部分 virtualenvwrapper-win 的用法,但对于初学者管理平常项目的虚拟环境已经够用了。

updatedupdated2020-11-232020-11-23
add gitinfo