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

Bor*_*jaX 2 python subprocess function call

我想知道是否有一种创建子过程(通过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()
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?先感谢您。

gre*_*ggo 5

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

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


subprocess.Popen( ..., preexec_fn = my_pre_exec )
Run Code Online (Sandbox Code Playgroud)


gre*_*ggo 5

怎么样...

   subprocess.Popen( ..., preexec_fn = lambda : ( os.setegid(1000), os.seteuid(1000)) )
Run Code Online (Sandbox Code Playgroud)

...可能会舍弃该函数的返回值...