gpt4 book ai didi

python - shebang env首选python版本

转载 作者:IT王子 更新时间:2023-10-29 00:26:59 24 4
gpt4 key购买 nike

我有一些 python-2.x 脚本,我在不同的系统、Debian 和 Arch linux 之间复制它们。Debian 将 python 安装为“/usr/bin/python”,而 Arch 将其安装为“/usr/bin/python2”。一个问题是在 Arch linux 上也存在引用 python-3.x 的 '/usr/bin/python'。因此,每次我复制一个文件时,我都必须更正 shebang 行,这有点烦人。

我在 Arch 上使用

#!/usr/bin/env python2

在 debian 上我有

#!/usr/bin/env python

由于 Debian 上不存在 'python2',有没有办法通过首选应用程序?也许有一些外壳扩展?例如,我不介意它是否依赖于现有的 '/bin/sh'。以下会很好,但不起作用。

#!/usr/bin/env python2 python
#!/usr/bin/env python{2,}
#!/bin/sh python{2,}
#!/bin/sh -c python{2,}

令人沮丧的是 'sh -c python{2,}' 在命令行上运行:即它在可用的地方调用 python2,否则调用 python。

我不希望在 Debian 上创建链接“python2->python”,因为如果我将脚本交给其他人,它就不会运行。我也不想让“python”指向 Arch 上的 python2,因为它随着更新而中断。

有没有一种不用编写包装器就可以做到这一点的干净方法?

我意识到之前有人问过类似的问题,但我没有看到任何符合我的边界条件的答案:) Conditional shebang line for different versions of Python

---更新

我拼凑了一个丑陋的 shell 解决方案,目前可以完成这项工作。

#!/bin/bash
pfound=false; v0=2; v1=6
for p in /{usr/,}bin/python*; do
v=($(python -V 2>&1 | cut -c 7- | sed 's/\./ /g'))
if [[ ${v[0]} -eq $v0 && ${v[1]} -eq $v1 ]]; then pfound=true; break; fi
done
if ! $pfound; then echo "no suitable python version (2.6.x) found."; exit 1; fi
$p - $* <<EOF

PYTHON SCRIPT GOES HERE

EOF

解释:获取版本号(v 是一个 bash 数组)并检查

v=($(python -V 2>&1 | cut -c 7- | sed 's/\./ /g'))
if [[ ${v[0]} -eq $v0 && ${v[1]} -eq $v1 ]]; then pfound=true; break; fi

使用来自标准输入 (-) 的输入启动找到的程序 $p 并传递参数 ($*)

$p - $* <<EOF
...
EOF

最佳答案

#!/bin/sh
''''which python2 >/dev/null 2>&1 && exec python2 "$0" "$@" # '''
''''which python >/dev/null 2>&1 && exec python "$0" "$@" # '''
''''exec echo "Error: I can't find python anywhere" # '''

import sys
print sys.argv

这首先作为 shell 脚本运行。您可以将几乎任何 shell 代码放在 ''''# ''' 之间。此类代码将由 shell 执行。然后,当 python 在文件上运行时,python 将忽略这些行,因为它们看起来像 python 的三引号字符串。

shell 脚本测试二进制文件是否存在于 which python2 >/dev/null 路径中,如果存在则执行它(所有参数都在正确的位置)。有关更多信息,请参阅 Why does this snippet with a shebang #!/bin/sh and exec python inside 4 single quotes work?

注意:该行以四个 ' 开头,第四个 ' 和 shell 命令的开头之间必须没有空格(which...)

关于python - shebang env首选python版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18993438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com