子流程:执行两个或多个prexec fn

2024-04-25 14:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种方法可以创建一个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()

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


Tags: 方法importgetosargsfunctionfnsubprocess
3条回答

不如。。。在

   subprocess.Popen( ..., preexec_fn = lambda : ( os.setegid(1000), os.seteuid(1000)) )

。。。假设函数的返回值被丢弃。。。在

这甚至行不通,因为对prexecuter的调用实际上执行setegid和seteuid操作,并且是在调用Popen之前完成的。怎么了

def my_pre_exec() :
    os.setegid(1000)
    os.seteuid(1000)


subprocess.Popen( ..., preexec_fn = my_pre_exec )

如果您正在寻找延迟函数调用的通用方法:

def defer_call_to( func, *parms, **kwparms ):
    def caller():
        func( *parms, **kwparms)
    return caller

现在你可以做了

^{pr2}$

。。。因为defer_call_to返回一个函数在调用时执行延迟调用。在

如果您想要多个,现在可以正常工作:

   sp = subprocess.Popen(["whoami"], preexec_fn=defer_call_to( preExecuter,listOfFunctions))

但是,像我的另一个答案一样只写一个函数会更简洁

相关问题 更多 >