我完全感到困惑和迷惑。我一直很高兴地从终端编写和运行 Python 脚本(并且还运行 Python 解释器)。我上床睡觉是一个快乐的 Python 用户,但突然间我无法从 shell 运行任何 Python 脚本。
hello.py
包含:
#!/usr/bin/python3
print('Hello world!')
然而突然:
% ./hello.py
./hello.py: 1: #!/usr/bin/python3: not found
./hello.py: 2: Syntax error: word unexpected (expecting ")")
但
% python3 hello.py
Hello world!
% python hello.py
Hello world!
什么。这。扎金。法德沃克斯。
ls -la hello.py
显示:
-rwxrwxr-x 1 Lexible Lexible 44 May 25 08:35 hello.py
根据@Kulfy 的两个请求
% file -k hello.py
hello.py: Python script text executable\012- a /usr/bin/python3 script, UTF-8 Unicode (with BOM) text executable
% cat -e hello.py
M-oM-;M-?#!/usr/bin/python3$
print('Hello world!')$
ls -la /usr/bin/python3*
显示:
lrwxrwxrwx 1 root root 9 Mar 13 05:20 /usr/bin/python3 -> python3.8
-rwxr-xr-x 1 root root 5457536 Apr 27 08:53 /usr/bin/python3.8
lrwxrwxrwx 1 root root 33 Apr 27 08:53 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root 16 Mar 13 05:20 /usr/bin/python3-config -> python3.8-config
-rwxr-xr-x 1 root root 384 Mar 27 19:39 /usr/bin/python3-futurize
-rwxr-xr-x 1 root root 388 Mar 27 19:39 /usr/bin/python3-pasteurize
对于笑声...
% which python
/usr/bin/python
% which python3
/usr/bin/python3
甚至...
% python3
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello world!')
Hello world!
>>>
PS:我使用的是 Ubuntu 20.04(Focal Fossa)。我已经尝试重新启动,sudo apt install -f --reinstall python3 python3.8 python3-minimal python3.8-minimal libpython3.8-minimal
但都无济于事。
由于您可以使用 运行脚本
python3 hello.py
,因此很明显问题不在于 Python 安装或符号链接。相反,问题在于脚本本身。由于之前的一些外星字符,shell(这里是 zsh)并没有真正识别出 shebang
#
。它尝试使用默认的 shell/解释器执行整个脚本,从而产生错误。您可以使用
-e
选项cat
来检查脚本的实际内容。-e
基本上是v
和的组合E
。v
使用^
和M-
符号,并E
显示$
在每行的末尾。观察 的输出后
cat -e hello.py
,该脚本似乎在其 shebang/hashbang 附近包含一个字节顺序标记,该标记可能已被某些 Windows 软件插入。这阻止了脚本实际加载 Python 解释器,因此它被 zsh 执行,从而导致错误。您可以使用 删除 BOM 和其他特定于 DOS 的字符
dos2unix
。dos2unix
将处理所有 Windows/DOS 类型的字符/行尾并将它们转换为类 Unix 的。或者,您也可以使用
sed
删除 BOM。由于 BOM 存在于 UTF-8 中,因此它们的十六进制表示为EF BB BF
.在@Kulfy 的慷慨帮助下,问题似乎是我的脚本中的 shebang 之前的一些不可渲染的字节!具体来说,字节在应该是脚本开始的字节
EF BB BF
之前。23 21
字节顺序标记是如何出现的仍然是个谜,但至少现在: