我想知道是否有办法创建一个subprocess(通过subprocess.Popen
),可以选择性地调用两个(或更多)preexec_fn
。
例如,调用setegid
和seteuid
(仅作为示例)。
到目前为止,我发现了这种解决方法(好吧......它有效,但它看起来不太直接或“干净”)
#!/usr/bin/python2.7
import subprocess
import os
def preExecuter(listOfFunctions):
for functionEntry in listOfFunctions:
functionEntry["function"](* functionEntry.get("args", []), **functionEntry.get("kwargs", {}))
listOfFunctions = [
{
"function": os.setegid,
"args": [1000],
},
{
"function": os.seteuid,
"args": [1000],
},
]
if __name__ == "__main__":
sp = subprocess.Popen(["whoami"], preexec_fn=preExecuter(listOfFunctions))
sp.communicate()
有更好的方法吗?提前谢谢。
答案 0 :(得分:4)
这甚至不起作用,因为对preExecuter的调用实际上执行了setegid和seteuid操作,并且在调用Popen之前完成。
有什么问题def my_pre_exec() :
os.setegid(1000)
os.seteuid(1000)
subprocess.Popen( ..., preexec_fn = my_pre_exec )
答案 1 :(得分:4)
怎么样......
subprocess.Popen( ..., preexec_fn = lambda : ( os.setegid(1000), os.seteuid(1000)) )
...大概是函数的返回值被丢弃了......
答案 2 :(得分:2)
如果您正在寻找推迟函数调用的通用方法:
def defer_call_to( func, *parms, **kwparms ):
def caller():
func( *parms, **kwparms)
return caller
现在你可以做到
subprocess.Popen( ..., preexec_fn = defer_call_to( os.set_gid, 1000))
...因为defer_call_to返回一个函数,在调用时会执行延迟调用。
如果您想要多个,现在可以正常使用:
sp = subprocess.Popen(["whoami"], preexec_fn=defer_call_to( preExecuter,listOfFunctions))
但是,在我的其他答案中编写一个函数更简洁