Python shebang和新行

Python shebang和新行,python,bash,shebang,Python,Bash,Shebang,要使Python脚本在Linux和bash上可执行,可以使用shebang #! /usr/bin/env python 作为脚本的第一行。如果此行恰好以Windows样式的换行符\r\n(回车换行符)而不是Unix样式的换行符结束,则bash将无法通过Python解释器运行该脚本 我正在用Python进行跨平台开发。在Windows中工作时,自然换行符为\r\n。当我在Linux中工作时,自然换行符是\n。考虑到我使用Mercurial进行版本控制,在包含shebang的脚本文件中强制使用换

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

#! /usr/bin/env python
作为脚本的第一行。如果此行恰好以Windows样式的换行符\r\n(回车换行符)而不是Unix样式的换行符结束,则bash将无法通过Python解释器运行该脚本

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

您可能需要签出


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

此问题对于在非本机平台上开发的所有脚本都是常见的,而不仅仅是Python。大多数SCM具有自动换行功能。Mercurial可以做到这一点,但这不是默认设置。看

通常的方法不是自己生成外部包装脚本,而是在
setup.py
中指定它们,并让它们在包安装期间生成

如果您执行以下操作:

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

…然后,在安装时,将生成并安装名为
script\u name
的包装器,并对其进行适当配置,以在当前平台上运行(shebang line和所有)。这使得使用中的行尾字符变得毫无意义。

尝试将shell的注释字符添加到行尾。能否将windows编辑器配置为使用unix样式的行尾字符?我尝试了/usr/bin/env python#,运气不好。我不想配置编辑器,因为我希望shebang的工作由一个能够抵抗微小人为错误的自动进程来保证。@MarkRansom shebang是由操作系统处理的,而不是由shell处理的——这就是为什么可以使用
execve()直接调用脚本(shell和其他脚本)
syscall。EOL扩展似乎是个不错的主意。为什么它被标记为最后手段?@Kaba我不知道,我自己也在想。Subversion也有这个特性,它没有这样的警告。在subversion中,您可以使用属性标记每个文件,其中一个属性称为
svn:eol style
,您可以将其设置为
native
,它还将执行自动转换。然后可以为某些文件自动添加此标记。这似乎很恰当。在任何情况下,我都需要处理打包,因此如果它也可以处理shebang,那么问题似乎已经解决了。@Kaba这解决了Python的问题,但不解决其他脚本或源文件的问题。SCM方法在一般情况下解决了这一问题。因此,您可能还想设置它。@Keith此方法还解决了EOL方法无法解决的问题。您的机器上有单独的
python2.4
python2.6
解释器吗?
setup.py
方法创建的包装器与安装库时使用的包装器相同,而不是依赖于
/usr/bin/env
来选择路径中的第一项内容。我同意两者都有价值,但是对于Python来说,仅仅依靠EOL转换是不合适的解决方案。这是最好的方法,但只适用于Python。但是OP也可以从自动化的SCM转换中受益,因为还有其他原因。另一种方法(不是一种好方法,但是如果您正在处理一些需要定期更新的上游代码,那么这种方法可以工作)是
cd$(dirname$(which python));ln-s python ^M
(^M键入为ctrl-v ctrl-M)。这会使文件名的末尾返回一个文本框。这不是好的做法。最好在代码上运行一些工具来转换它。我使用的是
dos2unix
,但其他任何工具都可以使用。