env: python\\r: 没有那个文件或目录

新手上路,请多包涵

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

 #!/usr/bin/env python

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

env: python\r: No such file or directory

我之前从存储库中提取了这个脚本。这可能是什么原因?

原文由 Niklas R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

该脚本包含 CR 字符。 shell 将这些 CR 字符解释为参数。

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

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

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 :set ff=unix

保存并退出:

 :wq

完毕!

解释

ff stands for _file format_ , and can accept the values of unix ( \n ), dos ( \r\n ) 和 mac ( \r ) (仅用于 pre-intel mac,在现代 mac 上使用 unix

要阅读有关 ff 命令的更多信息:

 :help ff

:wq 代表 W rite 和 Q uit,更快的等价物是 Shift + zz (即按住 Shift 然后按 z 两次)。

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

对多个文件的使用

没有必要在 vim 中实际打开文件。可以直接从命令行进行修改:

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

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

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

😱 offtopic :如果你碰巧卡在 vim 中需要退出, 这里 有一些简单的方法。

去除 BOM 标记

有时,即使在设置了 unix 行尾之后,您仍然可能会在运行文件时遇到错误,尤其是当文件是可执行文件并且具有 shebang 时。该脚本可能有一个 BOM 标记(例如 0xEFBBBF 或其他),这会使 shebang 无效并导致 shell 抱怨。在这些情况下 python myscript.py 可以正常工作(因为 python 可以 处理 BOM)但是 ./myscript.py 将在设置执行位时失败,因为你的 shell(sh、bash、zsh 等) 可以’ 处理BOM标记。 (创建带有 BOM 标记的文件的通常是 记事本 等 Windows 编辑器。)

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

 :set nobomb

原文由 ccpizza 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题