pythonsubprocessnicerenice

Is it possible to renice a subprocess?


I know about os.nice() it works perfect for parent process, but I need to do renice of my child subprocesses. I found way to do this, but it seems to be not very handy and too excessive:

os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )

And it isn't return resulting nice level after renicing.

Is there more clean way to renice subprocesses in python?


Solution

  • Use the preexec_fn parameter of subprocess.Popen:

    If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. (Unix only)

    Example:

    >>> Popen(["nice"]).communicate()
    0
    (None, None)
    >>> Popen(["nice"], preexec_fn=lambda : os.nice(10)).communicate()
    10
    (None, None)
    >>> Popen(["nice"], preexec_fn=lambda : os.nice(20)).communicate()
    19
    (None, None)