我有一些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脚本获取回显。
答案 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从未看过它们。