在Windows中使用#!/usr/bin/env python3 shebang

14

我正在尝试在Windows命令行中将Python脚本作为命令运行——因此不使用"Python"或".py"。如果我的脚本名为"testing.py",我正在尝试将这个名字变成一个命令,并从命令行调用"testing"。

查看文档,我似乎需要使用这个shebang #!/usr/bin/env python 只要我在PATH中有Python的存在。

https://docs.python.org/3/using/windows.html#shebang-lines

我也将脚本文件夹添加到了我的PATH中,所以像"testing.py"这样的东西目前可以在命令行中工作。

根据文档和这篇教程, https://dbader.org/blog/how-to-make-command-line-commands-with-python

只要我在PATH中有适当的路径和上述shebang,我就应该能够通过"testing"来启动我的Python脚本。然而,我似乎不能在没有添加".py"的情况下运行脚本。

4个回答

10

@AKX的回答对于Windows 10标准的Python 3是不正确的,尤其是在最新的Windows 10(1903)中,如果不是更早的版本。

(注:我不知道这在WSL下是否有效。)

我安装了几个版本的Python(2.7、3.6、3.7和最新的Python 3.8b1)。多年来,我一直在我的脚本中使用#!/usr/bin/env shebang以实现跨平台兼容性(通常用于区分Py2与Py3脚本)。

我在一个文件夹中创建了一个小脚本(C:\so_test\awtest.py):

#!/usr/bin/env python3.6
import sys
print(sys.version)

如果我使用awtest.py或者只用awtest运行这个程序,就会报告3.6.x(显示它正在使用Python 3.6)。如果我更改shebang以引用3.7,则会报告3.7.x。如果我将shebang更改为#!/usr/bin/env python3,则会安装最新版本的Python(3.8)。

现在,如果我将那个文件夹添加到我的路径中(在您进行测试的命令窗口中使用path=%PATH%;C:\so_test,或者在主要环境变量中(如果您执行后者,则需要重新启动命令窗口)),我可以切换到另一个目录并运行awtestawtest.py,它们仍然能够工作并且引用路径中的文件夹。如果我从路径中删除脚本文件夹,则找不到这些文件。

虽然我不一定期望在Windows 10之前或Python 2.7上运行此功能,但这种功能似乎是未来发展的方向。


这是在WSL下还是使用纯Windows Python? - AKX
普通的 Windows Python(如果不禁用所有其他正常虚拟化,就无法使用 WSL 进行测试。这太遗憾了——WSL 确实很有趣。) - MartyMacGyver
2
啊,好的。我看了一下 - 这是因为.py已经与Py启动器相关联,可以以各种创造性的方式解释shebang行:https://docs.python.org/3/using/windows.html#shebang-lines - 此外,为了使awtest正常工作,必须在您的安装中将.py添加到PATHEXT中。 - AKX

5
不,Windows 不支持 shebang 行。
你链接的文档与 Python 安装的 py 启动器相关,它可以解释各种 shebang 行,以选择要运行脚本的 Python 版本。
setuptools 能够为你的 Python 脚本生成包装 .exes,但这需要一些操作,并且已经假定你有一个带有 setup.py 等的软件包。
在本地,如果你真的非常需要这个功能,你可能可以将 .py 添加到 PATHEXT 环境变量中,这样 Windows 命令行就会像查找 .exe 一样查找 .py(和其他各种文件格式;当前现代默认设置是 .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC)。然而,这自然不适用于分发应用程序,因为所有用户也需要设置。

我的建议是坚持使用那个无聊的老旧的 python testing.py,真的。


2

您可以通过将解释器的路径设置为文件的第一行来在Windows中使用shebang(您将在VSCode上看到一个标记,该标记显示“设置为解释器”)。 例如,在使用Windows 10和Python版本3.9时:

#!C:/Users/waithira/AppData/Local/Programs/Python/Python39/python.exe 
print('hello world')

0

如果你不经常这样做,你仍然可以将一个批处理文件添加到你的路径中testing.bat,其中包含你需要执行代码的命令。

@echo off
python testing.py

这是一个有点无聊的解决方法,但它可以正常工作,而且不需要提及扩展名,因为Windows会以相同的方式解释批处理文件和可执行文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接