2

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 に答える