首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python虚拟env通过WSL成功激活,但无法工作。

python虚拟env通过WSL成功激活,但无法工作。
EN

Stack Overflow用户
提问于 2021-12-29 12:30:31
回答 1查看 1.6K关注 0票数 2

在我的windows系统上,我成功地使用windows命令提示符安装了一个虚拟环境(python版本为3.9)

python -m venv C:\my_path\my_venv

总是使用windows命令提示符,我可以通过以下方式激活创建的venv

C:\my_path\my_venv\Scripts\activate.bat

我确信静脉是正确激活的,因为:

在windows终端上,我看到命令行前面有(my_venv)

  • if --从终端(python)激活python,并运行以下命令:import sys;在路径列表中,我可以看到所需的路径[..., 'C:\\my_path\\my_venv\\lib\\site-packages\\win32\\lib', ...]

  • if (如安装包)中所需的路径,所有操作都可以在venv

中完成。

总之,到目前为止一切都很好。

我也有WSL2 ( Ubuntu ),我想使用Ubuntu终端激活相同的venv。如果,从Ubuntu终端,我激活了venv

source /mnt/c/my_path/my_venv/Scripts/activate

它似乎可以工作,因为命令行是由(my_venv)预先执行的,但是当我运行python (python3命令)然后运行import syssys.path时,我看到系统的目标是基本的Ubuntu安装(Version3.8),而不是venv安装:

['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']

静脉不是真的激活了。有解决这个问题的建议吗?

如果可以的话,我会添加几个信息。

如果我试图使用Ubuntu终端直接创建一个venv

python3 -m venv /mnt/c/my_path/my_venv_unix

通过Ubuntu终端(source /mnt/c/my_path/my_venv_unix/bin/activate)激活它一切都很好,但这不是我想要的:我想使用WSL激活一个使用windows命令提示符创建的虚拟环境,因为在我的机器上,我有很多用windows创建的venv,我不想复制它们。

在脚本C:\my_path\my_venv\Scripts\activate (/mnt/c/my_path/my_venv/ script /activate使用wsl文件夹命名)之后(我必须将source /mnt/c/my_path/my_venv/Scripts/activate从windows更改为Ubuntu,否则命令source /mnt/c/my_path/my_venv/Scripts/activate将无法工作)

代码语言:javascript
复制
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    # reset old environment variables
    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
        PATH="${_OLD_VIRTUAL_PATH:-}"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
        hash -r 2> /dev/null
    fi

    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
        PS1="${_OLD_VIRTUAL_PS1:-}"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    if [ ! "${1:-}" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi
}

# unset irrelevant variables
deactivate nondestructive

VIRTUAL_ENV="C:\my_path\my_venv"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/Scripts:$PATH"
export PATH

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
    unset PYTHONHOME
fi

if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
    _OLD_VIRTUAL_PS1="${PS1:-}"
    PS1="(.venv_ml_dl_gen_purpose) ${PS1:-}"
    export PS1
fi

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
    hash -r 2> /dev/null
fi

最后,这里还有脚本/mnt/c/my_path/my_venv_unix/bin/activate

代码语言:javascript
复制
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    # reset old environment variables
    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
        PATH="${_OLD_VIRTUAL_PATH:-}"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
        hash -r
    fi

    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
        PS1="${_OLD_VIRTUAL_PS1:-}"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    if [ ! "${1:-}" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi
}

# unset irrelevant variables
deactivate nondestructive

VIRTUAL_ENV="/mnt/c/my_path/my_venv_unix"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
    unset PYTHONHOME
fi

if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
    _OLD_VIRTUAL_PS1="${PS1:-}"
    if [ "x(venv_unix) " != x ] ; then
    PS1="(venv_unix) ${PS1:-}"
    else
    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
        # special case for Aspen magic directories
        # see https://aspen.io/
        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
    fi
    fi
    export PS1
fi

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
    hash -r
fi

感谢任何想要回答的人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-29 15:19:24

简短的回答:强烈建议在WSL中使用Linux版本的Python和工具。您可以在Stack溢出上找到一些与此相关的帖子,但是您的问题(关于venv)非常不同,值得自己回答。

更详细的情况:

同样值得阅读的是this question。在这种情况下,问题在于双引导系统,以及Windows和Linux之间是否可以共享相同的venv。

我知道,在WSL上运行Windows似乎更好,但实际上并不适合这种情况。

您已经解决了第一个问题,即行尾的差异,但是您面临的下一个问题是目录格式的差异。在获取activate之后,执行一个echo $PATH,您将看到Windows C:\path\to\the\venv路径已被添加到您的PATH中。对于WSL来说,这需要/mnt/c/path/to/the/venv

那是行不通的。

一旦您修复了这个问题(同样,通过编辑activate),您仍然在尝试运行python3。venv可执行文件实际上是python.exe。在WSL下,您必须指定扩展。

所以如果你:

  1. 将行尾从CRLF更改为LF
  2. ,将activate中的路径样式从WSL2格式更改为WSL2格式
  3. 使用python.exe可执行文件

G 219

然后您至少可以启动Windows版本。您的import sys; sys.path将显示Windows路径。

尽管如此,你几乎肯定会遇到额外的问题,不值得这么做。例如,如果一个脚本假定为pythonpython3,甚至是pip,那么这些脚本就会失败,因为它需要调用,例如,pip.exe

行尾和本机代码也将是一个问题。

出于这些原因(可能还有更多原因),强烈建议在WSL中使用Python的Linux版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70519432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档