【问题标题】:MacOS: Shebang with absolute path not workingMacOS:绝对路径的 Shebang 不起作用
【发布时间】:2021-04-15 00:53:44
【问题描述】:

在某些情况下,使用 shebang 选择 Python 解释器似乎不起作用。

我正在尝试在 MacOS 上的 shebang (#!/...) 中使用我的 python3.9 解释器。请参阅下面名为 hello.py 的 Python 文件:

#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9
print("Hello world")

现在,我将确保这个文件是可执行的,并尝试执行它:

$ chmod +x ./hello.py
$ ./hello.py

./hello.py: line 2: syntax error near unexpected token `"Hello world"'
./hello.py: line 2: `print("Hello world")'

这很奇怪。我打错了什么吗?让我尝试直接用我的解释器执行它,看看它是否有效:

$ /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9 ./hello.py

Hello world

这似乎工作正常。为什么shebang失败了?让我尝试使用不同的解释器:

#!/usr/bin/python3
print("Hello world")
$ ./hello.py

Hello world

现在它可以工作了吗?这很有趣。

问题:

  • 为什么 /nix/store-path 在 shebang 中似乎不起作用?
  • MacOS 上的 shebang 表达式是否存在一些我不知道的限制?例如最大长度,或某些不允许的字符,如 .-

我的系统:

  • MacOS Big Sur 11.2.1 (20D74)
  • bash --version:GNU bash,版本 4.4.23(1)-release (x86_64-apple-darwin17.7.0)

编辑:从 zsh 而不是 bash 执行 ./hello.py 实际上有效(使用 nix-shebang 时)。所以这可能暗示这是一个特定于 bash 的问题。

【问题讨论】:

  • 大多数 Unix 系统的 shebang 行有 127 个字符的限制,所以这不应该太长。
  • 我可以重现这个。该脚本使用 bash 作为其解释器运行,而不是 python。
  • Bash 有一堆逻辑来尝试模拟调用失败时execve() 调用应该做的事情。这种逻辑有相当长的错误历史。我不相信这会是其中之一。
  • 更有趣的是/usr/bin/python -c 'import subprocess; subprocess.call(["./test.py"], shell=False)',给出了一个Exec格式错误。这对我来说意味着操作系统确实有这个shebang的问题,因此我们依赖于活动shell的后备行为。

标签: python python-3.x shell nix shebang


【解决方案1】:

MacOS 不支持 shebangs 指向脚本——这会导致 Exec 格式错误

bash 和 zsh 都尝试以不同程度的成功解决execve() 失败。然而,更好的解决方法是使用上游 nixpkgs 的能力——正如在 https://github.com/NixOS/nixpkgs/pull/93757 中介绍的那样——生成一个不会触发错误的包装器。

这个包装器不会看起来像:

#!/nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9

...但看起来更像:

#!/nix/store/74shlfgb18717ixjlpivpxd7iqcyhyn5-bash-4.4-p23/bin/bash /nix/store/i46k148mi830riq4wxh49ki8qmq0731k-python3-3.9.2-env/bin/python3.9

...有点令人惊讶的是,它按预期工作。

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 2013-07-06
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2020-12-23
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多