子进程:执行两个或多个preexec_fn

时间:2012-12-28 20:56:36

标签: python function call subprocess

我想知道是否有办法创建一个subprocess(通过subprocess.Popen),可以选择性地调用两个(或更多)preexec_fn

例如,调用setegidseteuid(仅作为示例)。

到目前为止,我发现了这种解决方法(好吧......它有效,但它看起来不太直接或“干净”)

#!/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()

有更好的方法吗?提前谢谢。

3 个答案:

答案 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))

但是,在我的其他答案中编写一个函数更简洁