【问题标题】:Python shebang and newlinesPython shebang 和换行符
【发布时间】:2012-09-24 16:18:58
【问题描述】:

要使 Python 脚本在 Linux 和 bash 上可执行,可以使用 shebang

#! /usr/bin/env python

作为脚本的第一行。如果此行恰好以 Windows 样式的换行符 \r\n(回车 - 换行符)而不是 Unix 样式的换行符 \n 结尾,那么 bash 将无法通过 Python 解释器运行脚本。

我正在使用 Python 进行跨平台开发。当我在 Windows 中工作时,自然换行符是 \r\n。当我在 Linux 中工作时,自然换行符是 \n。鉴于我使用 Mercurial 进行版本控制,在包含 shebang 的脚本文件中强制使用 \n 换行符的最佳方法是什么?

【问题讨论】:

  • 尝试将shell的注释字符添加到行尾。
  • 您可以将您的 Windows 编辑器配置为使用 unix 样式的行尾吗?
  • 我试过了#! /usr/bin/env python #,没有运气。我不想配置编辑器,因为我希望 shebang 的工作能够通过一个自动过程来保证,该过程可以防止微不足道的人为错误。
  • @MarkRansom shebangs 由操作系统而不是 shell 处理——这就是为什么可以使用execve() 系统调用直接调用脚本(shell 和其他)的原因。

标签: python bash shebang


【解决方案1】:

常见的做法是根本不自己生成外包装脚本,而是在你的setup.py中指定它们,让它们在安装包的过程中生成。

如果您执行以下操作:

setup(
    entry_points = {
        "console_scripts": [
            "script_name": "your.module.name:main",
        ],
    }
)

...然后,在安装时,将生成并安装一个名为 script_name 的包装器,并对其进行适当的配置以在您当前的平台(shebang 行和所有平台)上运行。这使得使用中的行尾字符没有实际意义。

【讨论】:

  • 这似乎恰到好处。无论如何我都需要照顾包装,所以如果它也能照顾shebang,那么问题似乎就解决了。
  • @Kaba 这解决了 Python 的问题,但不适用于其他脚本或源文件。 SCM方法在一般情况下解决了它。因此,您可能还想设置它。
  • @Keith 这种方法还解决了 EOL 方法无法解决的问题。您的机器上有单独的python2.4python2.6 解释器吗? setup.py 方法创建包装器以使用与安装库相同的包装器,而不是依赖 /usr/bin/env 来选择路径中的第一件事。我同意两者都使用是有价值的,但对于 Python,仅依靠 EOL 转换是一个不充分的解决方案。
  • 我不同意你的观点。这是最好的方法,但仅适用于 Python。但由于其他原因,OP 也可以从自动 SCM 转换中受益。
  • 另一种方法(不是一个好方法,但如果您正在处理一些需要定期更新的上游代码,则可以使用该方法)是cd $(dirname $(which python)); ln -s python python^M(^M 键入为 ctrl-v ctrl -m)。这使得文件名在末尾带有文字回车。这不是好的做法。最好在代码上运行一些工具来转换它。我使用dos2unix,但任何数量的其他工具都可以工作。
【解决方案2】:

这个问题对于在非本地平台上开发的所有脚本都很常见,而不仅仅是 Python。大多数 SCM 具有自动行结束转换功能。 Mercurial 可以做到这一点,但这不是默认设置。请参阅EOL Extension

【讨论】:

  • EOL 扩展似乎是一个非常好的主意。为什么将其标记为不得已的功能?mercurial.selenic.com/wiki/FeaturesOfLastResort
  • @Kaba 我不知道,我自己也想知道。 Subversion 也有这个特性,它没有这样的警告。在 subversion 中,您可以使用属性标记每个文件,其中一个称为svn:eol-style,您可以将其设置为native,它也会进行自动转换。然后可以为某些文件自动添加此标签。
【解决方案3】:

您可能想签出EolExtension

使用EolExtension,您可以为您的存储库强制使用特定的行结尾。以不同行结尾提交的文件会自动转换。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2018-10-24
    • 1970-01-01
    • 2011-11-26
    • 2011-07-25
    • 2018-11-05
    • 2017-10-03
    相关资源
    最近更新 更多