avi*_*wal 1 linux python executable shebang interpreter
shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那么为什么既#!/usr/bin/python和#!/usr/local/bin/python我的工作?
正如其他人所指出的,shebang 行必须引用存在的实际文件。
由于不同的系统可以将二进制文件安装到不同的位置,这是脚本可移植性的弱点。
正如其他人提到的那样,解决此问题的一种方法是使用链接。
另一种方法是编辑脚本以引用系统上的正确路径。
解决此问题的另一种方法是使用/usr/bin/env,它将在您的 PATH 中找到可执行文件。
所以而不是:
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
写:
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
这样,人们只需要/usr/bin/env在需要时进行符号链接,而不是每个单独的可执行文件。
当然,可执行文件仍然必须在你的 PATH 中才能工作......
如您所见,没有 100% 清洁的解决方案。请记住:“越差越好”(:
的#!(家当)线必须指定一个实际存在的可执行文件。如果两者都在您的系统上运行,则意味着您在两个地方都安装了 python。或者,可能是一个符号链接。
通常,您会在尝试使用不存在的解释器时遇到错误:
anthony@Zia:~$ /tmp/test
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果您改为像这样运行脚本,那么路径可能无关紧要:
anthony@Zia:~$ python /tmp/test
anthony@Zia:~$
Run Code Online (Sandbox Code Playgroud)
那是因为您正在直接运行 python,并向它传递一个参数。然后 Python 决定打开该文件并将其视为脚本。在第一种情况下,内核试图将脚本作为可执行文件运行。它会检查它,注意到shebang 行,并尝试将其转换为第二种形式,因此它实际上可以运行它。如果后面给出的路径#!实际上不存在,则失败。
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |