Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“窗口”;PythonLauncher";当虚拟环境处于活动状态时,不会检测某些Shebang的python3_Python_Python 3.x_Python Venv - Fatal编程技术网

“窗口”;PythonLauncher";当虚拟环境处于活动状态时,不会检测某些Shebang的python3

“窗口”;PythonLauncher";当虚拟环境处于活动状态时,不会检测某些Shebang的python3,python,python-3.x,python-venv,Python,Python 3.x,Python Venv,我一直使用#/usr/bin/env python3用于我的python脚本,因为Debian发行版通常对2.7版使用python,对3.x版使用python3,更改此约定可能会在系统中引起问题(例如,请参阅此问题) 但是,我无法让它在Windows上正常工作。考虑一台带有标准Python的机器(从中下载),并为所有用户安装为管理员。以下是打印可执行文件和(基本)前缀的脚本: 现在,请看以下内容: PS C:\pytest> gcm python | select Source C:\Pr

我一直使用
#/usr/bin/env python3
用于我的python脚本,因为Debian发行版通常对2.7版使用
python
,对3.x版使用
python3
,更改此约定可能会在系统中引起问题(例如,请参阅此问题)

但是,我无法让它在Windows上正常工作。考虑一台带有标准Python的机器(从中下载),并为所有用户安装为管理员。以下是打印可执行文件和(基本)前缀的脚本:

现在,请看以下内容:

PS C:\pytest> gcm python | select Source
C:\Program Files\Python37\python.exe

PS C:\pytest> gcm python3 | select Source
C:\Users\user\AppData\Local\Microsoft\WindowsApps\python3.exe
如您所见,Windows上的python3.exe是一个“存根”,它在页面上显示Microsoft应用商店,以便从中安装Python。我提到这一点是为了防止它具有重大意义。但是,运行上述脚本会得到正确的结果:

PS C:\pytest> .\script.py
EXECUTABLE: C:\Program Files\Python37\python.exe
PREFIX: C:\Program Files\Python37
BASE PREFIX: C:\Program Files\Python37
不幸的是,如果我创建并激活虚拟环境:

PS C:\pytest> python -m venv .venv
PS C:\pytest> . .\.venv\Scripts\Activate.ps1
(.venv) PS C:\pytest> .\script.py
EXECUTABLE: C:\Program Files\Python37\python.exe
PREFIX: C:\Program Files\Python37
BASE PREFIX: C:\Program Files\Python37
我不明白为什么会发生这种情况,因为根据python启动器的说法,它应该能够检测活动的虚拟环境。它似乎确实与shebang中的版本限定符有关。如果我修改脚本以使用
#/usr/bin/env python
它似乎工作得很好:

(.venv) PS C:\pytest> .\script.py
EXECUTABLE: C:\pytest\.venv\Scripts\python.exe
PREFIX: C:\pytest\.venv
BASE PREFIX: C:\Program Files\Python37
正如一开始所解释的,我不想修改我的脚本来使用没有版本限定符的shebang。在使用python3 shebang时,有没有办法配置python启动器来正确检测虚拟环境?《公约》明确规定:

上述任何虚拟命令都可以加上显式版本(主版本或主版本和次版本)的后缀

此外,它还指出:

shebang线的/usr/bin/env形式还有一个特殊属性。在查找已安装的Python解释器之前,此表单将搜索Python可执行文件的可执行路径

但是,即使尝试将python.exe作为python3.exe复制到我的虚拟环境中,它似乎也不起作用:

(.venv) PS C:\pytest> copy .\.venv\Scripts\python.exe .\.venv\Scripts\python3.exe
(.venv) PS C:\pytest> gcm python3 | select Source

Source
------
C:\pytest\.venv\Scripts\python3.exe


(.venv) PS C:\pytest> .\script.py
EXECUTABLE: C:\Program Files\Python37\python.exe
PREFIX: C:\Program Files\Python37
BASE PREFIX: C:\Program Files\Python37
python启动器仍然会忽略虚拟环境,即使python3.exe在路径中可见并选择系统安装

更新:我在如何删除python3.exe存根中找到了它,该存根将您带到Microsoft应用商店并将其删除,以查看它是否有任何区别。没有任何改变,所以这个问题完全在于python启动器

更新2:这是通过设置PYLAUNCH_debug=1启用后的调试信息

(.venv) PS C:\pytest> $env:PYLAUNCH_DEBUG=1
(.venv) PS C:\pytest> .\script.py
launcher build: 32bit
launcher executable: Console
File 'C:\Users\user\AppData\Local\py.ini' non-existent
File 'C:\WINDOWS\py.ini' non-existent
Called with command line: "C:\pytest\script.py"
maybe_handle_shebang: read 168 bytes
maybe_handle_shebang: BOM not found, using UTF-8
parse_shebang: found command: python3
locating Pythons in 64bit registry
locate_pythons_for_key: unable to open PythonCore key in HKCU
locate_pythons_for_key: "C:\Program Files\Python37\python.exe" is a 64bit executable
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\win32\python.exe: The filename, directory name, or volume label syntax is incorrect.
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\amd64\python.exe: The filename, directory name, or volume label syntax is incorrect.
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\python.exe: The filename, directory name, or volume label syntax is incorrect.
locating Pythons in native registry
locate_pythons_for_key: unable to open PythonCore key in HKCU
locate_pythons_for_key: unable to open PythonCore key in HKLM
found no configured value for 'python3'
search for Python version '3' found '"C:\Program Files\Python37\python.exe"'
run_child: about to run '"C:\Program Files\Python37\python.exe" "C:\pytest\script.py" '
EXECUTABLE: C:\Program Files\Python37\python.exe
PREFIX: C:\Program Files\Python37
BASE PREFIX: C:\Program Files\Python37
child process exit code: 0

更新3:在Mark建议这只是一个bug之后,我已经提出并等待确认。

我可以复制。它看起来像一只虫子。如果我使用活动虚拟环境(
script.py
)隐式(
script.py
)或显式(
py script.py
)运行脚本,我将获得全局安装的Python,但是
py-c“import sys;print(sys.executable)”
将从虚拟环境中获得Python。如果我从脚本中删除shebang,我将得到虚拟环境的Python。感谢Mark的确认。我将提出一个bug报告,并在得到那里的开发人员的确认后发回,以结束这个问题……从调试消息来看,当出现一个shebang时,它似乎不需要检查虚拟环境,只要使用
#运行即可/usr/bin/env python
因为这似乎很有效,我可以理解你的意思:
parse_shebang:found命令:python搜索路径,在路径C:\pytest\.venv\Scripts\python.exe上搜索python可执行文件python,现在的解决方法是:如果我使用python显式运行脚本。\script.py
调用venv解释器,即使使用了shebang
python3
。这样至少脚本可以保持不变,保持shebang。
(.venv) PS C:\pytest> $env:PYLAUNCH_DEBUG=1
(.venv) PS C:\pytest> .\script.py
launcher build: 32bit
launcher executable: Console
File 'C:\Users\user\AppData\Local\py.ini' non-existent
File 'C:\WINDOWS\py.ini' non-existent
Called with command line: "C:\pytest\script.py"
maybe_handle_shebang: read 168 bytes
maybe_handle_shebang: BOM not found, using UTF-8
parse_shebang: found command: python3
locating Pythons in 64bit registry
locate_pythons_for_key: unable to open PythonCore key in HKCU
locate_pythons_for_key: "C:\Program Files\Python37\python.exe" is a 64bit executable
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\win32\python.exe: The filename, directory name, or volume label syntax is incorrect.
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\amd64\python.exe: The filename, directory name, or volume label syntax is incorrect.
locate_pythons_for_key: "C:\Program Files\Python3\PCbuild\python.exe: The filename, directory name, or volume label syntax is incorrect.
locating Pythons in native registry
locate_pythons_for_key: unable to open PythonCore key in HKCU
locate_pythons_for_key: unable to open PythonCore key in HKLM
found no configured value for 'python3'
search for Python version '3' found '"C:\Program Files\Python37\python.exe"'
run_child: about to run '"C:\Program Files\Python37\python.exe" "C:\pytest\script.py" '
EXECUTABLE: C:\Program Files\Python37\python.exe
PREFIX: C:\Program Files\Python37
BASE PREFIX: C:\Program Files\Python37
child process exit code: 0