/usr/bin/env: 'python3\r': 没有那个文件或目录

you*_*arx 19 python command-line bash

我正在尝试使我的.py文件可执行,以便我可以使用 运行它们./filename.py,但它对我不起作用。

我所做的是添加shebang#!/usr/bin python3并使用命令chmod +x filename.py。当我./filename.py以普通用户身份运行时,我收到以下错误消息

bash: ./filename.py: /usr/bin: bad interpreter: Permission denied
Run Code Online (Sandbox Code Playgroud)

作为超级用户,它告诉我这个:

sudo: unable to execute ./filename.py: Permission denied
Run Code Online (Sandbox Code Playgroud)

使用通常的方法 ( python3 filename.py)打开文件效果很好。

当我将shebang更改为#!/usr/bin/env python3它时,它告诉我:

/usr/bin/env: ‘python3\r’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Byt*_*der 40

问题是你的行尾字符。您的文件是在 Windows 系统上创建或编辑的,并使用 Windows/DOS 样式的行尾 (CR+LF),而 Ubuntu 等 Linux 系统则需要 Unix 样式的行尾 (LF)。

有一个简单的工具可以为您转换两种不同的样式,称为dos2unix.

通过运行安装它

sudo apt install dos2unix
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用以下命令之一在任一方向转换文件

dos2unix /PATH/TO/YOUR/WINDOWS_FILE
unix2dos /PATH/TO/YOUR/LINUX_FILE
Run Code Online (Sandbox Code Playgroud)

例子:

$ cat test.py 
#!/usr/bin/env python3
print("ok")

$ ./test.py 
/usr/bin/env: ‘python3\r’: No such file or directory
$ dos2unix test.py 
dos2unix: converting file test.py to Unix format ...
$ ./test.py 
ok
Run Code Online (Sandbox Code Playgroud)

回到你首先尝试过的,shebang 行

#!/usr/bin python3
Run Code Online (Sandbox Code Playgroud)

当然是错误的。它尝试/usr/bin使用python3脚本的文件名作为参数执行文件。这显然必须失败,因为它/usr/bin是一个目录并且没有可执行文件。