【问题标题】:How do you specify the shebang line of a command script created by setuptools如何指定由 setuptools 创建的命令脚本的 shebang 行
【发布时间】:2011-07-06 16:18:48
【问题描述】:

我创建了一个包,我将在整个公司分发它,它替换了具有相同名称的旧 bash 脚本。它在很多地方被引用,因此它需要像当前脚本一样执行。这一直很好,直到我遇到一些没有当前版本的 Python 作为默认 Python(又名 CentOS)的服务器。

有没有办法在 setup.py 中指定在脚本文件顶部创建的 shebang 行?即我需要#!/opt/bin/python 而不是#!/usr/bin/env python

【问题讨论】:

    标签: python packaging setuptools


    【解决方案1】:
    • 使用/opt/bin/python script.py 运行脚本,或者
    • 将第一行编辑为#!/opt/bin/python,或
    • /opt/bin 放在/usr/bin 之前的路径中。

    【讨论】:

    • 虽然 opt/bin 在我的路径中,但我不能保证脚本的所有用户都会这样做。该脚本将安装在许多机器上,因此手动干预不是一种选择。用户将从我们自己的 PyPi 服务器 pip 安装它。
    • @zenweasel setuptools 将重写 shebang 行以匹配当前运行它的 Python 解释器的位置。所以你以/opt/bin/python setup.py ... 调用构建,它会在shebang 行中得到它。
    • @Keith,谢谢,这就是我需要的答案。如果您想输入答案,我可以将其标记为答案。特别是当我编辑了问题时,这些其他答案并不适用。
    • 此答案不会试图以任何身份理解问题。问题是关于setup.py build 及其参数,以及用于生成此行的内容,而不是在构建包后如何手动修复它。
    【解决方案2】:

    Keith 回答了我的问题。以/opt/bin/python setup.py install 运行 setup.py 会产生我需要的结果,而无需任何用户干预。

    【讨论】:

      【解决方案3】:

      首先了解为什么需要 shebang -
      使用 shebang 可以让系统知道使用哪个命令来运行脚本。

      这是什么意思?
      这意味着当您在终端中像这样简单地执行脚本时 -

      $ ./script.py
      

      “script.py”作为您在命令行中提到的命令的参数给出。

      所以,如果shebang指向python解释器,上面的命令就相当于这个-

      $ python script.py
      

      所以现在你可以理解 shebang 的目的了——它只是给出了脚本解释器的路径。 (在你的情况下,python 解释器)。

      注意,如果你像这样执行你的脚本,shebang 是没有意义的 -

      $ python script.py
      

      (这是因为您正在调用 python 可执行文件并将 script.py 作为第一个参数传递,它只是忽略了第一行,因为它是它的注释。)

      所以,现在来解决您的问题 - 如果您有两个 python 安装并且您想使用非默认 python 安装来执行您的脚本,那么您要做的是 -
      1. 简单地以$ /opt/bin/python script.py 执行并忽略shebang。

      2. 更改script.py的shebang即可,然后执行为./script.py

      如果我必须只运行一次script.py,我会选择第一个选项,如果我必须多次执行它,我会选择第二个(所以我不会浪费时间每次都写/opt/bin/python

      【讨论】:

      • 谢谢,但这根本不能解决我的问题。问题是让 setuptools 添加正确的信息,因为此脚本将在我们公司广泛分发。
      • 看,如果你像这样执行它,she bang 指向的位置并不重要 - $ /opt/bin/python script.py,那么为什么要关心 setuptools 添加正确的信息呢?我想我已经回答了你的问题。不过,你可以明确你到底想要什么。 (或者至少告诉我你打算如何在你的机器上执行脚本。)
      • 是的,这一切都很好理解。脚本将由 php 文件、cron 作业、web 服务等执行。它正在替换一个具有完全相同名称的 bash 脚本文件由其他 shell 脚本执行。所以它需要完全像$scriptname一样执行。
      • 很抱歉,我没有让我的问题的上下文更清楚,但这完全是关于 setuptools,我不想让每个人都厌烦我为什么需要它的整个背景故事。
      • @bfontaine 谢谢。我想我在写答案的时候理解有误,后来也懒得纠正了。
      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2020-02-01
      • 2014-10-17
      • 2016-06-04
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多