为什么 setup.py 通常没有 shebang 行?

Why does setup.py usually not have a shebang line?

查看随机选择的知名 Python 包,为什么总的趋势是 setup.py 顶部不包含 #!/usr/bin/env python 行?我知道通常推荐的与文件交互的方式是这样的:

python setup.py install

而不是

./setup.py install

但这有充分的理由吗?

这些包不包含 shebang:pytest, lxml, six, virtualenv, pip

但是这些是:requests, simplejson, setuptools

setup.py 将为您 运行 使用的 Python 解释器及其库路径进行安装。 shebang 将定义该解释器,而这不是开发人员所希望的。

即使您有一个带有 shebang 的 setup.py,您仍然应该 运行 前面有解释器的文件。它可以防止您提出诸如“包裹去哪儿了!?”之类的问题。

因为 python 包也必须在 Windows 平台上工作。 python setup.py install 是通用命令

在这种情况下,shebang 几乎没有什么好处,但有一个很大的缺点:

  • shebang 有用的原因与此处无关:

    • 它简化了重复使用脚本(减少输入)
    • 它阐明了 how/what 查看源代码时脚本的作用。
  • shebang 必然决定用于 运行 它的解释器。我写了 setup.py 个脚本,我测试过 python setup.py installpython3 setup.py install;在这些情况下,我根本不知道在 shebang 中放什么。

根据我的经验,sh 在各种发行版中几乎总是位于 /bin 中,或者至少位于符号链接到 /bin 的文件夹中。他们几乎总是遵循相同的标准。所以使用 #!/bin/sh 在几乎所有情况下都有效,当然 Windows 机器除外。那是完全不同的东西。

Python,另一方面,这个部门有点乱。首先,并非所有发行版都将 python 二进制存储或符号链接到 /bin/python,例如 Ubuntu 在 /usr/bin/python 中仍然只有 python 的二进制。另一方面,即使对于 /bin 中有 python 的那些,在某些 OS 上,如 Fedora 和 OS X,/bin/python 意味着 Python2,而在其他方面,如 Arch linux,/bin/python 表示 Python3。考虑到 Python2 和 Python3 代码不完全兼容,如果使用 #!/bin/python 和 运行 脚本与

./setup.py

如果 python3 在您的机器上用作解释器,可能会导致问题,但实际上 python2 是脚本作者的意思。