返回Python解释器的bash脚本可以代替shebang吗?

时间:2019-02-27 21:52:36

标签: python python-3.x bash

我有一些Python脚本,现在正在跨多个测试平台的各种各样的人运行它们。这有两个原因造成了问题:

  1. 在所有测试人员中python3路径都不相同,并且
  2. 并非所有运行脚本的人都在$ PATH中设置了Python路径。

由于(1)我无法对shebang进行硬编码,因为它依赖于测试人员,并且由于(2)#!/usr/bin/env python3不能保证将其放置在Python文件的顶部。

我知道python3解释器将位于测试器中的几个位置之一。因此,我想知道的是, 是否有可能 用对bash shell脚本的调用来替换Python文件顶部的#!/usr/bin/env python3 python位置,然后为脚本“设置”它?如果那不可能,那么剩下的事就没有意义了。

我创建了一个bash脚本,该脚本会仔细检查可能的位置,直到找到解释器为止,但是我不知道如何做,只是将其返回到Python文件的顶部。

例如,我创建了一个基本的python文件(shebang.py)

#!./pyshebang.sh

print("Hello World")

pyshebang.sh做两件事,它将找到的python路径附加到PATH,然后将该路径回显到解释器。如果我运行上面的python脚本,则stdout从bash脚本获取回显,但从python脚本获取回显。

2 个答案:

答案 0 :(得分:1)

  

是否有可能用对bash shell脚本的调用替换Python文件顶部的#!/usr/bin/env python3,该脚本查找python位置,然后将其“设置”为脚本?

是的,当然。实际上,/usr/bin/env python3就是这样做的。该特定命令没有什么魔力。它及其变体恰好具有广泛的用途。

  

我创建了一个bash脚本,该脚本会仔细检查可能的位置,直到找到解释器为止,但是我不知道如何做,只是将其返回到Python文件的顶部。

您对正在发生的事情有误解。 shebang行不会导致脚本被替换。相反,它导致指定的行作为命令执行,原始脚本的路径及其参数作为附加参数被附加。

因此,您的pyshebang.sh应该遵循以下常规格式:

#!/bin/bash
# Note: the above shebang line is not a special case

# ... find Python ...

MY_PYTHON=/the/python/I/discovered

# Execute the discovered Python, passing it all the arguments this
# script received
exec "$MY_PYTHON" "$@"

答案 1 :(得分:0)

您可以使用如下所示的方法让外壳程序找到正确的解释器,然后使用该解释器重新运行当前脚本。

#!/bin/sh

''':'
cmd=$(./pyshebang)
exec "$cmd" "$0" "$@"
:' '''

print("Hello")

这是一个shell脚本。第一个命令是:,由空的单引号字符串和带引号的:构成。 :是无人操作。下一条命令将变量cmd设置为./pyshebang返回的路径,然后执行命令以$cmd指示的程序替换当前进程,并以当前脚本名称作为第一个脚本。参数,并接受传递给shell脚本的任何其他参数。

然后由Python解释器运行同一文件时,它会看到一个文档字符串('''...'''),其内容(先前执行的shell代码)将被忽略。然后执行从正确的Python代码开始,在找到exec命令之前,shell从未看过它们。