它应该可以工作,我测试了多次(例如:[SO]: PyWin32 (226) and virtual environments)。
是的,它们是两种不同类型的动物:
示例:
e:\Work\Dev\StackOverflow\q059885771>sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[prompt]> set PY
PYTHONPATH=e:\Work\Dev\Utils\current
[prompt]> dir /b
[prompt]> "c:\Install\pc064\Python\Python\03.07.06\python.exe" -c "import sys, venv;print(sys.version);print(venv)"
3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]
<module 'venv' from 'c:\\Install\\pc064\\Python\\Python\\03.07.06\\lib\\venv\\__init__.py'>
[prompt]> "c:\Install\pc064\Python\Python\03.07.06\python.exe" -m venv
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
[--upgrade] [--without-pip] [--prompt PROMPT]
ENV_DIR [ENV_DIR ...]
venv: error: the following arguments are required: ENV_DIR
[prompt]> time<nul
The current time is: 21:51:57.12
Enter the new time:
[prompt]> "c:\Install\pc064\Python\Python\03.07.06\python.exe" -m venv ".\venv_dir"
[prompt]> echo %errorlevel%
0
[prompt]> time<nul
The current time is: 21:52:10.54
Enter the new time:
[prompt]>
[prompt]> dir /b
venv_dir
[prompt]> "venv_dir\Scripts\python.exe"
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z
[prompt]>
注意事项:
- 确保事物确实是您认为的那样: 使用完整路径 (就像我对Python可执行文件所做的那样)。要查看在您的情况下调用哪个解释器,请在控制台中键入
where python3
- 将路径括在"${SOME_PATH}"中,因为它们可能包含空格(命令解释器将把空格后面的部分解释为前面一个参数)
- 检查命令返回代码
- 检查可能影响行为的环境变量(例如: PYTHONPATH)
- 当然,Python应该是有效的(安装期间没有遇到错误,在此之后没有删除/修改文件等)
当所有上述检查通过后,您应该能够创建和使用一个(venv 创建的)虚拟环境。
更新#0
我查看了问题中添加的
URL:
[SuperUser]:在Windows 10(版本1903)命令提示符上键入“python”会打开Microsoft商店(提到@Update,@TusharGautam,@MattJecha,@Ramhound的优秀答案,包含有用的信息和资源)。
显然,这是因为与“应用程序执行别名”相关的 2 个应用程序安装程序有关。然后,我更进一步,还从Microsoft Store安装了Python 3.7。
两个程序(应用程序安装程序和Python 3.7)都将一些项(包括可执行文件)放置在“%USERPROFILE%\AppData\Local\Microsoft\WindowsApps”中。有趣的事情是它们大小为 0 字节,它们既不是快捷方式也不是符号链接。我倾向于认为它们实际上不存在于文件系统中,而是某种“模拟条目”,Win 显示并表现得好像它们是真实存在的(当显示 .NET 组件(基本上是 .dll 文件)作为Windows Explorer 中的目录时,MS 所做的也是同样的事情)。
在下面的图片中,我选择了其中的两个框中的项目作为示例:
当选中一个时,另一个会自动取消选择,这很合理,因为两者都指向同一个“可执行文件”(
python3.exe)。
[prompt]> :: Python3.7 (python3.exe - installed from Microsoft Store) checked
[prompt]> dir "c:\Users\cfati\AppData\Local\Microsoft\WindowsApps\py*"
Volume in drive C is SSD0-WIN
Volume Serial Number is F2CE-FA29
Directory of c:\Users\cfati\AppData\Local\Microsoft\WindowsApps
20/01/24 12:32 0 python3.exe
20/01/24 12:12 <DIR> PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0
1 File(s) 0 bytes
1 Dir(s) 197,737,488,384 bytes free
[prompt]> python3 -c "import sys, os;print(\"VER: {0:}\nEXE: {1:}\nCWD: {2:}\nPyPATH: {3:}\".format(sys.version, sys.executable, os.getcwd(), sys.path))"
VER: 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 01:54:44) [MSC v.1916 64 bit (AMD64)]
EXE: C:\Users\cfati\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\python.exe
CWD: e:\Work\Dev\StackOverflow\q059885771
PyPATH: ['', 'e:\\Work\\Dev\\Utils\\current', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\\python37.zip', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\\DLLs', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\\lib', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1776.0_x64__qbz5n2kfra8p0\\lib\\site-packages']
[prompt]> echo %errorlevel%
0
[prompt]>
[prompt]> :: App Installer (python3.exe) checked
[prompt]> dir "c:\Users\cfati\AppData\Local\Microsoft\WindowsApps\py*"
Volume in drive C is SSD0-WIN
Volume Serial Number is F2CE-FA29
Directory of c:\Users\cfati\AppData\Local\Microsoft\WindowsApps
20/01/24 12:35 0 python3.exe
20/01/24 12:12 <DIR> PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0
1 File(s) 0 bytes
1 Dir(s) 197,737,291,776 bytes free
[prompt]> python3 -c "import sys, os;print(\"VER: {0:}\nEXE: {1:}\nCWD: {2:}\nPyPATH: {3:}\".format(sys.version, sys.executable, os.getcwd(), sys.path))"
Access is denied.
[prompt]> :: !!! "This app can't run on your PC" popped up !!!
[prompt]> echo %errorlevel%
5
作为注意事项,可执行文件(“
C:\Users\cfati\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\python.exe”)也是一个“模拟条目”,真正的文件实际上位于“
%ProgramFiles%\WindowsApps”。
来自
[MS.DevBlogs]: Who put Python in the Windows 10 May 2019 Update?(
重点是我的):
虽然 Python 仍然完全独立于操作系统,但每个 Windows 安装都会包括 python
和 python3
命令,可以直接转到Python 商店页面。
所以,你知道了,python3实际上并不是真正的python3(当然,也适用于python)。有趣的是,在你的情况下它“工作”了,而在我的情况下它报错了(ERROR_ACCESS_DENIED)。
结论:
- 我必须坚持始终使用完整路径。这样,您就不会受到操作系统发生更改的影响(好吧,您的文件可能会被删除或损坏,但那时您将面临更大的问题)
- 每次指定完整路径很快就会变得非常烦人,这就是为什么应该/可以使用PATH环境变量的原因。当然,这在可能的情况下(约90+%)运行良好,并显著提高了体验,但在某些情况下(例如其他安装的应用程序/工具也提供了Python,并将其目录添加到PATH中),它可能会触发有趣的结果
python3 -m venv c:\path\to\myenv
。 - Alex Wvirtualenv <envname> -p python3
吗?可能需要先执行pip install virtualenv
。 - rouhija