2

我想知道是否有一种方法可以创建一个连续调用两个(或更多)的进程(通过) 。subprocess.Popenpreexec_fn

例如,调用setegidand 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()

有没有更好的方法来做到这一点?先感谢您。

4

3 回答 3

5

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

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


subprocess.Popen( ..., preexec_fn = my_pre_exec )
于 2012-12-28T21:19:59.590 回答
5

怎么样...

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

...大概是函数的返回值被丢弃了...

于 2012-12-28T21:36:47.177 回答
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))

但是,像我的其他答案一样编写一个函数会更干净

于 2012-12-28T21:28:26.790 回答