Shebang语法:Windows和Linux上的Python脚本?

101 投票
6 回答
116039 浏览
提问于 2025-04-17 03:13

我有一些用Python写的小工具脚本,想让它们在Windows和Linux上都能用。我希望能避免每次都手动调用Python解释器。有没有简单的方法可以让shebang(脚本开头的指令)在Windows和Linux上都指向正确的位置?如果没有,还有没有其他方法可以在这两个系统上隐式调用Python解释器,而不需要在不同操作系统之间转移脚本时修改它?

补充说明:Windows上的shebang支持是通过Cygwin提供的,但我想在Windows上使用原生的Python解释器,而不是Cygwin的那个。

补充说明2:看起来shebang指令会覆盖Cygwin终端中的文件关联。我想我可以直接卸载Cygwin的Python,然后把/usr/bin/python链接到Windows原生的Python。

6 个回答

4

简短回答: 最简单的方法是安装 Windows版的git,它自带GitBash。然后在你的脚本里添加一行特别的代码,告诉系统在执行时用python来运行这些脚本。 #!/usr/bin/env python

更多信息: 和Cygwin不同,git bash可以直接使用你电脑上的Windows应用程序,而且你可以不需要任何配置就使用bash脚本。

它会自动把任何带有这行代码的文件当作可执行文件,就像Linux系统一样处理。 比如:#!/usr/bin/env php#!/usr/bin/env node,只要你把这些应用程序的路径添加到Windows的环境变量中,就都能正常工作。

你可以通过点击开始菜单,输入 env 来编辑环境变量,应该会看到第一个选项。

Git bash还会安装git,并为你连接一个凭证管理器,让你轻松登录支持双重身份验证的svn服务,以及其他很多方便的开发者功能。

在我看来,Git bash是每个开发者电脑上必备的工具。


另一种选择: 安装WSL(Windows子系统Linux),它的功能和Git bash类似。 如果你愿意,WSL还可以让你安装所有命令行应用程序的Linux原生版本。

如果安装了Linux版本的程序,它们会优先于Windows版本,但你随时可以通过在命令后面加上 .exe 来选择运行Windows版本的命令。

46

除非你在使用cygwin,否则Windows系统不支持shebang。shebang是指在脚本文件开头用来指定解释器的那一行。不过,当你安装Python时,它会为.py文件添加文件关联。这意味着如果你在命令行中只输入脚本的名字,或者在Windows资源管理器中双击它,Python就会自动运行这个脚本。

我通常会在我的脚本中加上一个#!/usr/bin/env python的shebang。这让我的脚本在Linux系统上可以正常工作。如果你在安装了Python的Windows机器上运行这个脚本,文件关联也应该是存在的,这样它也能正常运行。

66

可以去看看关于 Windows的Python启动器 的文档,这个最初在 PEP 397 中有介绍。这个启动器让你可以在 "py.ini" 文件中定义自定义的 shebang 配置(比如使用 pypy),而且你可以直接使用虚拟 shebang,比如 #!/usr/bin/env python3,或者使用带有真实路径的 shebang,比如 #!"C:\Python33\python.exe"。(如果路径中有空格,记得要加引号。)你还可以在 shebang 中添加命令行选项。例如,下面的 shebang 在脚本结束后会进入交互模式: #!/usr/bin/python3 -i

安装程序会将 .py(控制台)和 .pyw(图形界面)脚本文件类型与相应的启动器 py.exe 和 pyw.exe 关联起来,以便在 Windows 中支持 shebang。对于所有用户的安装,启动器会安装到 Windows 文件夹中(也就是 %SystemRoot%)。如果是单用户安装,你可能需要手动将安装目录添加到 PATH 中,这样才能在命令行中使用 py.exe (*). 然后你可以通过命令行运行 Python,比如 py -2py -3py -2.6py -3.3-32(32位),等等。这个启动器在结合 -m 使用时特别方便,可以用特定版本的解释器运行模块,比如 py -3 -m pip install


(*) 在 3.5 及以上版本的新安装程序中,默认会将启动器安装到 "%LocalAppData%\Programs\Python\Launcher" 目录,而不是和 "python.exe" 放在一起,并且会自动将这个目录添加到 PATH 中。

撰写回答