【问题标题】:"python myscript" ignores "#!/usr/bin/env pythonX" where pythonX doesn't exist“python myscript”忽略不存在 pythonX 的“#!/usr/bin/env pythonX”
【发布时间】:2016-07-15 17:18:46
【问题描述】:

为什么没有安装 Python 3 时test.py 不抛出错误env: python3: No such file or directory

我的系统 (Mac OS X) 安装了 Python 2.7,但没有安装 Python 3:

$ /usr/bin/env python -V
Python 2.7.12
$ /usr/bin/env python3 -V
env: python3: No such file or directory

文件test.py:

#!/usr/bin/env python3
import sys
print sys.executable

执行 test.py:

$ python test.py
/usr/local/opt/python/bin/python2.7

我认为由于我的系统上不存在 Python 3,因此使用 shebang 行 #!/usr/bin/env python3 会引发错误并终止脚本。但env 实际上选择了 Python 2.7 解释器。

【问题讨论】:

    标签: python macos shebang


    【解决方案1】:

    当操作系统尝试执行脚本时,shebang 会被解释。输入python test.py,操作系统执行pythonpython 执行脚本(并且python 是基于当前PATH 找到的),而不是由操作系统处理。

    如果您使脚本可执行(chmod +x test.py)然后尝试直接执行它(例如./test.py),操作系统将负责运行脚本,因此它会查看 shebang 以确定什么是程序负责运行脚本。在这种情况下,/usr/bin/env 将寻找 python3 并尝试使用它。由于python3 不存在(或在您的PATH 上找不到),您会看到错误。

    【讨论】:

    • 我相信实际上是 exec 系列函数处理了 shebang 行;我不认为涉及到外壳。
    • shebang 实际上是由试图执行脚本的系统调用解释的。 shebang 的第一个字符是#,因此shell 会忽略它。
    • /usr/bin/env 的角色有点手忙脚乱(实际上是 execvp,通过路径搜索,而不是标准的 execv 需要一个明确的完全合格的路径),但这里没有什么是完全不准确的。
    • [更完整/迂腐:操作系统执行/usr/bin/env/usr/bin/env 使用 C 库调用进行 PATH 查找,然后执行 execv 告诉操作系统替换其进程映像在内存中使用 Python]
    • @CharlesDuffy -- 是的。我认为在这种情况下稍微挥手可能是可以的。我更想知道什么时候执行shebang,什么时候不执行。 /usr/bin/env 的细节比我们理解这个想法所需的要深入一点(有时当你挖掘得太深时,事情会变得泥泞)......
    【解决方案2】:

    只有在你执行test.py 时才会处理shebang,直接运行文件而不是运行python 并以test.py 作为参数。当您执行python test.py 时,Python 会完全忽略 shebang 行。

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 2016-11-23
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2012-09-21
      • 2013-04-04
      • 2015-08-28
      相关资源
      最近更新 更多