目标:
我正在尝试创建一个新的虚拟环境,并使用特定的python版本。
问题
当我键入:
python3 -m virtualenv --python="D:Python_Versionspython.exe" new_virtualenv
我得到:
运行时错误:未能找到python_spec='D:\python_Versions\python.exe'的Builtin发现的解释器
我所做的:
- 安装Ubuntu Bash for Windows:
打开Windows命令提示符
wsl --install
来源:https://learn.microsoft.com/en-us/windows/wsl/install
- 安装管道
打开Windows命令提示符:
bash
然后
sudo apt-get install python-pip
- 安装Virtualenv
类型
pip install virtualenv
- 下载python版本(此处为3.6)
转到:https://www.python.org/downloads/release/python-360/
下载:Windows x86-64可执行安装程序
安装到您选择的文件夹中,即D:Python_Versions
- 尝试使用特定的python版本创建虚拟环境(失败)
在命令提示符中,转到项目文件夹("cd…")并键入:
python3 -m virtualenv --python="D:Python_Versionspython.exe" new_virtualenv
来源:使用不同的Python版本与virtualenv
通常,问题不在于尝试指定不同的Python版本,而在于尝试将Python可执行文件用于不同的操作系统。在WSL中,您基本上是在运行Linux二进制文件和库,但您试图让Linux Python使用Windows Python可执行文件创建一个虚拟环境。
这是一个坏主意的原因有很多,你得到的错误证明了其中一个:
- Linux Python解释器不理解Windows路径,反之亦然
换句话说,Linux Python解释器python3
无法解析路径D:Python_Versionspython.exe
。
WSL提供了一个很好的";翻译";可以在Linux路径和Windows路径之间转换的实用程序wslpath
。例如:
/mnt/d/Python_Versions/python.exe
<->;D:Python_Versionspython.exe
/home/user/username/src/python_project
<->;\wsl$<distroname>homeuserusernamesrcpython_project
然而,这对解决这个特定问题没有帮助。你需要Linux Python来转换所有路径,这是不可能的
此外,虽然WSL可以运行Windows可执行文件(如python.exe
),但这些可执行文件将无法访问Linux库和进程。
另一个不起作用的原因是,Windows Python无法在允许Windows进程访问WSL/Linux文件的伪网络共享驱动器上运行。例如,如果您在PowerShell中:
cd $env:USERPROFILEDocuments
mkdir srcpython
cd srcpython
python -m venv new_virtualenv
# Works
但是(也来自PowerShell):
cd \$wsl<distroname>home<username>
mkdir srcpython
cd srcpython
python -m venv new_virtualenv
# Error: [WinError 1] Incorrect function
假设WindowsPython在您的Windows路径中,则可以,另一方面,在WSL:中
cd /mnt/c/Users/<username>/Documents
mkdir src/python
cd src/python
python.exe -m venv new_virtualenv
但是,您不能激活虚拟环境,因为WindowsPython不会为Linux创建激活脚本。它确实创建了一个Bash脚本,但它是为Git-Bash创建的,如果你检查它(venv目录中的./Scripts/activate
),你会发现它仍然使用Windows路径。
真的没有办法:
- 在Linux中进行开发时,请使用Linux Python二进制文件和模块
- 在Windows中进行开发时,请使用Windows Python二进制文件和模块
相反:
- 在Windows环境中时,请使用Windows Python二进制文件和模块
- 在Linux/WSL环境中时,请使用Linux Python二进制文件和模块
旁注:正如您现在可能意识到的,virtualenv
的--python
标志旨在允许您指定与操作系统体系结构匹配的不同Python版本。换言之,如果你在Ubuntu/WSL上(我不相信你是,以pip
为例):
sudo apt install python2
sudo apt install python3-pip
pip install virtualenv
python -m virtualenv --python=/usr/bin/python2 new_virtualenv
cd new_virtualenv
source bin/activate
python --version
# Will return Python 2.7.18
更新,解决您的其他评论:
对于如何在使用不同Python版本的不同环境的Windows上干净地安装Python(最好是所有环境都访问一个Spyder安装),同时不恢复到类似conda或类似的东西,你有什么建议吗?
由于Spyder本身就是一个Python应用程序,它在通信方面也会遇到同样的问题"跨平台";Pythonvirtualenv
所做的。您可以尝试将Windows Python可执行文件设置为WSL Spyder终端,但它实际上无法启动它,因为即使在Windows中安装Linux Spyder,它也无法与spyder-kernel
模块通信。
反之亦然。
我只是不知道(在我的研究中找不到)WSL<->;Spyder中的Windows互操作功能。
您还没有解释您同时需要Windows和Linux Python环境的用例,但如果您要使用Spyder,并且您确实需要Windows和LinuxPython二进制文件,那么我相信您需要安装两次Spyder——一次在Windows中,一次在WSL/Linux中。
据我所知,Conda是在Linux中安装Spyder的最佳选择。你也可以看看这个Ask Ubuntu的答案,但不幸的是,对我来说不起作用。
另一个选项
如果你没有完全绑定到Spyder,你可以考虑Visual Studio代码(Windows版本)。它确实能够与Windows和Linux/WSL Python解释器进行交互。
在安装";远程-WSL";扩展(来自Microsoft),它可以通过在WSL内设置Linux服务器来与LinuxPython交互。您可以访问WindowsPython虚拟环境(当处于"Windows模式"时)和WSL虚拟环境(在"远程-WSL"模式时)。
虽然我自己还没有尝试过这些特定的功能,但根据我对VSCode和WSL的了解,我相当确定你可以:
- 使用多个Windows Python版本设置Windows虚拟机
- 使用多个Linux Python版本设置一个Linux虚拟机
它对这两个平台都有调试支持,可以支持变量检查(基于这个答案),并且可能通过其丰富的扩展库(目前有652个搜索"Python"返回的扩展)提供更多。
它绝对值得一看,看看它是否能满足您的需求,因为它是少数几个可以直接与WSL互操作的WindowsIDE之一。我的理解是Pycharm也有WSL集成,但我还没有亲自探索过。