Python 3.8 脚本突然无法运行,但直接调用 Python 命令时运行正常

Lex*_*ble 21 scripts python3

我完全感到困惑和迷惑。我一直很高兴地从终端编码和运行 Python 脚本(并且还运行 Python 解释器)。我上床睡觉是一个快乐的 Python 用户,但突然间我无法从 shell 运行任何 Python 脚本。

hello.py 包含:

#!/usr/bin/python3
print('Hello world!')
Run Code Online (Sandbox Code Playgroud)

然而突然

% ./hello.py
./hello.py: 1: #!/usr/bin/python3: not found
./hello.py: 2: Syntax error: word unexpected (expecting ")")
Run Code Online (Sandbox Code Playgroud)

% python3 hello.py 
Hello world!
% python hello.py 
Hello world!
Run Code Online (Sandbox Code Playgroud)

什么。这。扎金。远行者。


ls -la hello.py 显示:

-rwxrwxr-x 1 Lexible Lexible    44 May 25 08:35  hello.py
Run Code Online (Sandbox Code Playgroud)

@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!')$
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为了笑...

% which python
/usr/bin/python
% which python3
/usr/bin/python3
Run Code Online (Sandbox Code Playgroud)

甚至...

% 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!
>>>
Run Code Online (Sandbox Code Playgroud)

PS:我使用的是 Ubuntu 20.04 (Focal Fossa)。我试过重启,sudo apt install -f --reinstall python3 python3.8 python3-minimal python3.8-minimal libpython3.8-minimal都无济于事。

Kul*_*lfy 48

由于您可以使用 运行脚本python3 hello.py,很明显问题不在于 Python 安装或符号链接。相反,问题在于脚本本身。

由于#. 它试图用默认的 shell/解释器执行整个脚本,从而产生错误。

您可以使用-e选项cat来检查脚本的实际内容。-e基本上是v和的组合Ev使用^M-符号,并E显示$在每行的末尾。

在观察 的输出后cat -e hello.py,脚本似乎在其 shebang/hashbang 附近包含一个字节顺序标记,标记可能已被某些 Windows 软件插入。这阻止了脚本实际加载 Python 解释器,因此它被 zsh 执行,从而导致错误。

您可以使用dos2unix.

dos2unix hello.py  # Install using `sudo apt install dos2unix` (if not already installed)
Run Code Online (Sandbox Code Playgroud)

dos2unix 将处理所有 Windows/DOS 类型的字符/行结尾并将它们转换为类 Unix 字符。

或者您也可以sed用来删除 BOM。由于 BOM 以 UTF-8 格式存在,因此它们的十六进制表示为EF BB BF.

sed -i '1s/^\xEF\xBB\xBF//' hello.py
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我使用 `hexedit` 删除了标记(替换为空格,然后在 `vi` 中手动删除)。狄更斯这个字节顺序标记(TY 供参考!对我来说是新手!)是如何得到的,这是一个谜。不运行wine,不运行Windows。 (3认同)
  • @Lexible 可能是您使用的任何 IDE 或软件的编码问题。对此我不确定。您可以删除过时的评论以减少噪音,因为您已经向问题添加了输出:) (3认同)
  • 我的 IDE 是 `vim`!也许我胖了一些疯狂的`vim`-fu。无论如何,感谢您的温柔微小的教育。你是一个很酷的人。:D (2认同)
  • @Lexible我以前从网站粘贴时输入了奇怪的隐形字符 (2认同)
  • @xjcl出于安全原因,强烈建议避免直接从网站复制。恶意(或不称职)网站运营商可以通过多种方式混淆其产品中的不良代码,从而可能破坏您的机器。 (2认同)

Lex*_*ble 8

在@Kulfy 的慷慨帮助下,问题似乎出在我脚本中 shebang 之前的一些无法呈现的字节!具体来说,字节EF BB BF23 21应该是脚本开头的字节之前。

字节顺序标记是如何得到的还是个谜,但至少现在是:

./hello.py
Hello world!
Run Code Online (Sandbox Code Playgroud)