Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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
Python 为什么有效的虚拟shebang会在Windows上破坏venv?_Python_Python 3.x_Windows_Shebang_Python Venv - Fatal编程技术网

Python 为什么有效的虚拟shebang会在Windows上破坏venv?

Python 为什么有效的虚拟shebang会在Windows上破坏venv?,python,python-3.x,windows,shebang,python-venv,Python,Python 3.x,Windows,Shebang,Python Venv,我正在尝试编写一个可以在Windows和Unix上运行的Python 3脚本 根据,我可以使用虚拟shebang: 为了允许Python脚本中的shebang行在Unix和Windows之间可移植,此启动器支持许多“虚拟”命令来指定要使用的解释器。支持的虚拟命令包括: /usr/bin/env python --剪断-- 此外,我可以添加一个后缀: 上述任何虚拟命令都可以加上显式版本(主版本或主版本和次版本)的后缀 因此,我认为以下两项都应该是Windows上的有效提示: #! /usr/bin

我正在尝试编写一个可以在Windows和Unix上运行的Python 3脚本

根据,我可以使用虚拟shebang:

为了允许Python脚本中的shebang行在Unix和Windows之间可移植,此启动器支持许多“虚拟”命令来指定要使用的解释器。支持的虚拟命令包括:

/usr/bin/env python

--剪断--

此外,我可以添加一个后缀:

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

因此,我认为以下两项都应该是Windows上的有效提示:

#! /usr/bin/env python

但是,当我使用第二个版本时,我的
venv
被忽略:

环境与资源 测试1:正如预期的那样,
venv
包在范围内 通过添加
3
作为shebang的后缀来更改文件 测试2:
venv
不再在范围内
为什么以这种方式更改shebang意味着
venv
不再在范围内?

虚拟环境以及Python的标准安装不包含“python3.exe”可执行文件,因此标准情况下的
PATH
搜索将不会返回任何结果。另一方面,所有活动虚拟环境(即使在Unix中)都始终有一个“python”命令。在“env”
PATH
search的情况下,如果名称以“python”开头,则启动器将仅在名称完全是“python”时搜索该名称。如果名称上有任何“X[.Y][32 |-64]”后缀,它将搜索已注册的安装。在开发过程中,应使用Python活动版本的跨平台测试脚本(无论发生什么情况)应执行“Python”。跨平台案例中不支持其他任何内容。OTOH,在活动Python中安装的脚本(例如通过具有标准安装和包配置的pip)将显式引用其shebang中的环境(例如“#!D:\venv\scripts\Python.exe”),并且在Windows上,该脚本可能嵌入到迷你启动器可执行文件(例如“f.exe”)中。无论虚拟环境是否处于活动状态,这些脚本都能正常工作。感谢@ErykSun的详细评论-如果您重新编写,我很乐意接受。对我来说,这似乎是一个毫无帮助的设计决定:我的理解是,在UNIX上,python 3.x二进制文件仍然很常见,它们喜欢被称为
python3
(与
python
)相反,因此,在Windows上使用
venv
的默认配置,在UNIX上使用普通的
python3
是不可能实现python3的跨平台shebang的。。?我希望Windows
py
启动器能够将shebang后缀与
venv
中使用的版本协调一致。你并不孤单。对于启动器对Unix“/usr/bin/env”的模拟缺乏“python3”支持,这是一个尚未解决的问题。只是没有人提出解决方案。简单的方法是停止搜索已注册的python,或者至少在所有“python”情况下延迟搜索注册表,直到搜索
PATH
之后。允许用户通过手动复制或符号链接可执行文件来自行解决“python3”问题。虚拟环境以及Python的标准安装不包含“python3.exe”可执行文件,因此标准情况下的
PATH
搜索不会返回任何结果。另一方面,所有活动虚拟环境(即使在Unix中)都始终有一个“python”命令。在“env”
PATH
search的情况下,如果名称以“python”开头,则启动器将仅在名称完全是“python”时搜索该名称。如果名称上有任何“X[.Y][32 |-64]”后缀,它将搜索已注册的安装。在开发过程中,应使用Python活动版本的跨平台测试脚本(无论发生什么情况)应执行“Python”。跨平台案例中不支持其他任何内容。OTOH,在活动Python中安装的脚本(例如通过具有标准安装和包配置的pip)将显式引用其shebang中的环境(例如“#!D:\venv\scripts\Python.exe”),并且在Windows上,该脚本可能嵌入到迷你启动器可执行文件(例如“f.exe”)中。无论虚拟环境是否处于活动状态,这些脚本都能正常工作。感谢@ErykSun的详细评论-如果您重新编写,我很乐意接受。对我来说,这似乎是一个毫无帮助的设计决定:我的理解是,在UNIX上,python 3.x二进制文件仍然很常见,它们喜欢被称为
python3
(与
python
)相反,因此,在Windows上使用
venv
的默认配置,在UNIX上使用普通的
python3
是不可能实现python3的跨平台shebang的。。?我希望Windows
py
启动器能够将shebang后缀与
venv
中使用的版本协调一致。你并不孤单。对于启动器对Unix“/usr/bin/env”的模拟缺乏“python3”支持,这是一个尚未解决的问题。只是没有人提出解决方案。简单的方法是停止搜索已注册的python,或者至少在所有“python”情况下延迟搜索注册表,直到搜索
PATH
之后。让用户通过手动复制或符号链接可执行文件来自行解决“python3”问题。
#! /usr/bin/env python3
PS D:\> py -m venv venv
PS D:\> .\venv\Scripts\Activate.ps1
(venv) PS D:\> py -V
Python 3.8.0
(venv) PS D:\> type .\f.py
#! /usr/bin/env python
import sys
for p in sys.path:
    print(p)
(venv) PS D:\> py .\f.py
D:\
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\python38.zip
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\DLLs
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\lib
C:\Users\btg\AppData\Local\Programs\Python\Python38-32
D:\venv
D:\venv\lib\site-packages
(venv) PS D:\> type .\f.py
#! /usr/bin/env python3
import sys
for p in sys.path:
    print(p)
(venv) PS D:\> py .\f.py
D:\
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\python38.zip
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\DLLs
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\lib
C:\Users\btg\AppData\Local\Programs\Python\Python38-32
C:\Users\btg\AppData\Local\Programs\Python\Python38-32\lib\site-packages