Python Popen.subprocess退出状态0,但程序在子进程成功完成后立即退出

时间:2017-04-24 10:31:37

标签: python subprocess

我正在尝试实时查看子进程的实时输出。我在这里尝试了几种方法,但它们对我不起作用。现在我有方法可行,但它导致我的程序在成功完成子进程后立即退出。我得到的返回码为零。该命令在FreeBSD jail(如chroot)中运行,实际上有效,它只是在完成程序的其余部分之前退出。

$(document).ready(function(){   
    $("a.open-newsletter").on( "click", function() {
        $("#newsletter").toggleClass('opened');
        userScroll = $(document).scrollTop();
        return false;
    });

    $(window , 'body').on('scroll', function() {
        if ( $("#newsletter").hasClass('opened') ) {
            var newScroll = $(document).scrollTop();
            if (userScroll - newScroll > 100 || newScroll - userScroll > 100) {
                $("#newsletter").removeClass('opened');
            }
        }
    });
});

2 个答案:

答案 0 :(得分:0)

我认为你打算在执行其他进程时使stdout静音,以防止python输出破坏子进程的输出。但是,这可能是不必要的,因为你的python代码只是等待,所以它无论如何都不能打印任何东西。

如果你想让python打印静音,然后恢复它们,那就更像是这样:

import os, sys
with open(os.devnull, 'w') as DEVNULL:
    save = sys.stdout # this is what you want to restore later
    sys.stdout = DEVNULL
    print "this prints to devnull (not really)"
    sys.stdout = save # restore the original sys.stdout

print "this prints to stdout"

请注意,save只是真正的sys.stdout的临时变量,您希望稍后再回来。

答案 1 :(得分:0)

正如@Kenny指出的那样,我已经重定向了sys.stdout,并且我的程序实际上仍然在sys.stdout = save之后执行。之后我添加了这一行来恢复输出到屏幕,sys.stdout = sys。 stdout 。所以这一切都是:

import os, sys, subprocess

 # Next 2 lines not needed
 # DEVNULL = open(os.devnull, 'w')
 # save = DEVNULL

 tick = re.escape("'")
 Jcmd = "jexec 1 sh -c '/usr/local/bin/aria2c --quiet=false -x 10 " + re.escape(links[1]) + tick
 proc = subprocess.Popen(Jcmd, shell=True)
 returncode = proc.wait()
 print "RETURN CODE: ", returncode

 # Next 2 lines not needed
 #sys.stdout = save
 #sys.stdout = sys.__stdout__

 print "THIS PRINT STATEMENT DOES NOT EXECUTE, PYTHON EXITS BEFORE"