Shebang Notation:Windows 和 Linux 上的 Python 脚本?

Posted

技术标签:

【中文标题】Shebang Notation:Windows 和 Linux 上的 Python 脚本?【英文标题】:Shebang Notation: Python Scripts on Windows and Linux? 【发布时间】:2011-11-26 07:55:18 【问题描述】:

我有一些用 Python 编写的小型实用程序脚本,我希望它们可以在 Windows 和 Linux 上使用。我想避免显式调用 Python 解释器。有没有一种简单的方法可以将 shebang 表示法指向 Windows 和 Linux 上的正确位置?如果没有,是否有另一种方法允许在 Windows 和 Linux 上隐式调用 Python 解释器,而无需在操作系统之间传输时修改脚本?

编辑:Cygwin 提供了 Windows 上的 shebang 支持,但我想在 Windows 上使用本机 Windows Python 解释器,而不是 Cygwin 解释器。

编辑#2:shebang 符号似乎覆盖了 Cygwin 终端中的文件关联。我想我可以卸载 Cygwin Python 并将 /usr/bin/python 符号链接到 Windows-native Python。

【问题讨论】:

我不认为 windows 有任何形式的 shebang 支持。您可以尝试为 .py 文件创建与 python 解释器的文件关联。 跟进 Nic ODell 的评论:每当我在 Windows 机器上安装 Python 时,安装过程都会负责为 .py 文件创建文件关联。这一直使用 python.org 站点上的 Windows 版 Python 安装程序。 在 Windows 上查看有关 Shebang Lines 的当前文档。请注意,您需要使用py 命令运行脚本才能使其生效。 如果您使用多个虚拟环境怎么办?那么有没有办法将特定文件与给定的解释器相关联? 【参考方案1】:

不适用于shebang ...但您可能可以设置文件关联,请参阅this SO question 处理Perl 和相关答案,这也将是相关的,因为Windows 和stdin/out 重定向存在已知问题。 ..

【讨论】:

【参考方案2】:

除非您使用的是 cygwin,否则 windows 不支持 shebang。但是,当您安装 python 时,它会添加为 .py 文件的文件关联。如果你只在命令行中输入你的脚本名称,或者在 windows 资源管理器中双击它,那么它将通过 python 运行。

我所做的是在我的脚本中包含一个#!/usr/bin/env python shebang。这允许在 linux 上支持 shebang。如果你在安装了 python 的 windows 机器上运行它,那么文件关联应该在那里,它也会运行。

【讨论】:

包含python版本号很好。 “python”在每个发行版中都没有链接到“python2.7”。 @mid_kid 这就是为什么我使用 env 来获取用户指定的默认 python 版本。 我的意思是那个并不总是正确的。尤其是在分发脚本时。 当您的脚本与上述 python 版本不兼容时,问题就开始了。一些发行版(例如:ArchLinux)将 python 与 python3 链接起来。至少指定主要版本号通常是个好主意:'#!/usr/bin/env python2'。也许你的脚本只适用于 2.7,因为你使用的东西只存在于所述版本中。 投反对票,因为这是过时的答案:Windows 现在可以识别 Python 文件的 shebang 行。【参考方案3】:

安装 pywin32。好处之一是它将 *.py 的文件关联设置到 python 解释器。

【讨论】:

【参考方案4】:

阅读文档中的Python Launcher for Windows,最初在PEP 397 中进行了描述。它让 您在“py.ini”中定义自定义shebang配置(例如使用pypy), 开箱即用,您可以使用虚拟 shebang,例如 #!/usr/bin/env python3,或带有真实路径的 shebang,例如 #!"C:\Python33\python.exe"。 (包含空格的路径需要引号。)您还可以将命令行选项添加到 shebang。比如下面的shebang添加了脚本终止后进入交互模式的选项:#!/usr/bin/python3 -i

安装程序将 .py(控制台)和 .pyw(GUI)脚本文件类型与分别命名的启动器 py.exe 和 pyw.exe 相关联,以便在 Windows 中启用对脚本的 shebang 支持。对于所有用户安装,启动器安装到 Windows 文件夹(即%SystemRoot%)。对于每用户安装,您可能需要手动将安装目录添加到 PATH 以便在 shell (*) 中使用 py.exe。然后从命令行,您可以通过py -2py -3py -2.6py -3.3-32(32 位)等运行 Python。当与 -m 结合使用时,启动器很方便,可以使用特定版本的解释器将模块作为脚本运行,例如py -3 -m pip install


(*) 3.5+ 中的新安装程序默认为“%LocalAppData%\Programs\Python\Launcher”,用于每个用户安装启动器,而不是将其安装在“python.exe”旁边,它会自动添加这个目录到PATH

【讨论】:

例如#!"C:\Program Files\Python37\python.exe" @tryptofan,是的,通常需要引用以避免安全漏洞,例如存在“C:\program.exe”的情况。 "C:\Python33\python.exe" 不需要引号,但为了清楚起见,我将更新我的示例以引用路径。 澄清一下,事实上,您可以在 Windows 上使用“仅限 linux”的 shebangs(例如 #!/usr/bin/env python3),它可以在 Windows 上正常工作。这就是“虚拟shebang”的意思。见docs.python.org/3/using/windows.html#shebang-lines @cowlinator,虚拟 shebangs 不仅仅包含 Unix 风格的路径。支持#!python3,我们甚至可以在“py.ini”中使用自定义命令扩展启动器。【参考方案5】:

抱歉打开旧话题。

我创建了一个文件py.cmd 并将其放在C:\Windows\System32 文件夹中

py.bat:

@(
@set /p shebang=
)<%1
@set shebang=%shebang:#! =%
@%shebang% %1 %2 %3 %4 %5 %6 %7 %8 %9

py.bat文件说明:

    *.py文件中获取第一行 删除shebang字符"#! " 使用 shebang python 路径运行 python 文件

所有windows python脚本必须以shebang行作为代码的第一行:

#! c:\Python27\python.exe

#! c:\Python37\python.exe

然后运行它: cmd&gt; py SomePyFile.py param1 param1 paramX

【讨论】:

【参考方案6】:

简答: 最简单的方法是安装 git for windows (git bash) 并使用 shebang 行。 #!/usr/bin/env python||anyothercommand

这是我在任何计算机上安装的第一件事,因为谁不想要 bash 而我们都使用 git,对吗?

更多信息: 与 Cygwin 不同,git bash 使用您的本机 Windows 应用程序,让您无需任何配置即可使用 bash 脚本。

它会自动将任何带有 shebang 行的文件视为可执行文件,如果它在你的路径中,它会以与 Linux 上的 bash 相同的方式运行命令。它也只使用 windows ENV 变量,因此您添加到从 Powershell 或 cmd 工作的路径中的任何内容也适用于 git bash。

您可以通过点击开始并键入env 来编辑windows 中的环境变量@ 应该是第一个选项。只需编辑您的用户路径变量(或所有用户的全局变量)并添加您希望在命令行中可用的任何应用程序。

还为您安装 git 并将其与 Windows 凭据管理器连接起来,让您可以非常轻松地登录到启用 2fa 的 svn 服务(例如 GitHub 到 bitbucket),因此您不必生成令牌。

还带有右键菜单,可以在任何位置打开 bash,甚至是仅使用 git 的 GUI。

在安装过程中,我建议您告诉它按原样检出并以 Unix 行结尾提交,以便对您的 Linux 和 macOS 伙伴友好。我还推荐了许多其他 git 配置,但这是另一个主题。


另一种选择: 安装 WSL(1 not 2) 更好,但需要一些配置。 (更改默认驱动器挂载路径手动连接凭据管理器等可以询问我所有这些,如果你想要有很多调整,我建议在 Windows 中运行 Linux。)

更巧妙地使用 WSL 意味着您可以将所有命令行应用程序的 Linux 版本与 Windows 应用程序分开。

如果您愿意,它仍然可以运行本机 Windows exe 文件,但如果安装了 Linux 二进制文件,则优先。

要设置 WSL,请在 power shell 中以管理员身份运行此命令:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

*需要重启

然后在 Microsoft 应用商店中搜索 Linux 并选择一个发行版。 (我推荐 Ubuntu 18LTS)

PS - 你也可以在 git bash 中运行 WSL ? 哦,如果你碰巧使用 php,windows composer.exe 也会使用 shebang 行来运行 WSL。

【讨论】:

以上是关于Shebang Notation:Windows 和 Linux 上的 Python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

获取魔术线/shebang中指定的编码(来自模块内)

Evaluate Reverse Polish Notation

Python之shebang

我应该使用 hashbang/shebang 吗?

Python脚本的正确shebang

Shebang(#!)[转]