env: python\r: No such file or directory环境变量: python\r: 没有这个文件或目录。

16 浏览
0 Comments

env: python\r: No such file or directory环境变量: python\r: 没有这个文件或目录。

我的Python脚本beak包含以下的shebang:

#!/usr/bin/env python

当我运行脚本$ ./beak时,我得到了

env: python\r: No such file or directory

我之前从一个仓库中拉取了这个脚本。这可能是什么原因呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这个脚本包含回车符。Shell会将这些回车符解释为参数。

解决方案:使用以下脚本从脚本中删除回车符。

with open('beak', 'rb+') as f:
    content = f.read()
    f.seek(0)
    f.write(content.replace(b'\r', b''))
    f.truncate()

0
0 Comments

vimvi 中打开文件,并执行以下命令:

:set ff=unix

保存并退出:

:wq

完成!

说明

ff 代表文件格式,可以接受 unix\n),dos\r\n)和 mac\r)这些值。对于现代的 Mac 电脑,请使用 unix,而不是 mac

要了解有关 ff 命令的更多信息:

:help ff

:wq 代表写入并退出,更快的等效方法是 Shift+zz(即按住 Shift 键,然后按两次z键)。

这两个命令必须在 命令模式 下使用。

离题:如果你不小心在 vim 中卡住了,并且需要退出,请看看这里

在多个文件上使用

实际上不必在 vim 中打开文件。可以直接从命令行修改:

 vi +':wq ++ff=unix' file_with_dos_linebreaks.py

要处理多个 *.py 文件(在 bash 中):

for file in *.py ; do
    vi +':w ++ff=unix' +':q' "${file}"
done

虽然看起来很简单,但是上面的 bash 语法会在文件名包含空格、引号、破折号等字符时出错。一个更可靠的替代方案是:

find . -iname '*.py' -exec vi +':w ++ff=unix' +':q' {} \;

删除 BOM 标志

有时即使将 Unix 换行符设置完毕后,运行文件时仍可能会出现错误,特别是当该文件是可执行文件且有一个 shebang 时。脚本可能会有一个 BOM 标记(如 0xEFBBBF 或其他标记),使得 shebang 无效并导致 shell 报错。在这种情况下,python myscript.py 会正常工作(因为 Python 可以处理 BOM),但是当设置可执行位后,./myscript.py 会失败,因为您的 shell(如 sh、bash、zsh 等)无法处理 BOM 标志。 (通常是 Windows 编辑器如记事本等创建带有 BOM 标记的文件。)

可以通过在 vim 中打开文件并执行以下命令来删除 BOM:

:set nobomb

0