Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子流程:执行两个或多个preexec\u fn_Python_Function_Call_Subprocess - Fatal编程技术网

Python 子流程:执行两个或多个preexec\u fn

Python 子流程:执行两个或多个preexec\u fn,python,function,call,subprocess,Python,Function,Call,Subprocess,我想知道是否有一种方法可以创建一个(通过subprocess.Popen)调用两个(或更多)preexec\u fn 例如,调用setegid和seteuid(仅用于示例目的) 到目前为止,我发现了这个解决方法(而且……它很有效,但看起来不太直接或“干净”) 有更好的方法吗?提前谢谢。这根本行不通,因为对preExecuter的调用实际上执行setegid和seteuid操作,并且是在调用Popen之前完成的。你怎么了 def my_pre_exec() : os.setegid(100

我想知道是否有一种方法可以创建一个(通过
subprocess.Popen
)调用两个(或更多)preexec\u fn

例如,调用
setegid
seteuid
(仅用于示例目的)

到目前为止,我发现了这个解决方法(而且……它很有效,但看起来不太直接或“干净”)


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

这根本行不通,因为对preExecuter的调用实际上执行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
现在你可以做了

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))
但是,像我的另一个答案那样编写一个函数会更简洁一些,

那么

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

。。。可能函数的返回值被丢弃了…

好吧。。。问题是我想要一种更“通用”的方式;创建一个函数来接受几个预执行函数使用第二个调用不是“seteuid(1000)”而是“os.seteuid(1000),这是最接近我所寻找的。现在对这个答案不太满意,因为这基本上就是lambda函数的用途…preexec_fn=lambda:preExecuter(listOfFunctions))
   subprocess.Popen( ..., preexec_fn = lambda : ( os.setegid(1000), os.seteuid(1000)) )