Python 3.4.2 Windows与Linux上的Popen差异

时间:2015-02-17 08:31:12

标签: linux windows popen python-3.4

我正在尝试编写一个使用Popen运行其他python脚本的python脚本。我有我想要的功能,但我注意到Linux上的不同行为与Windows相比。以下是我认为导致差异的代码段:

                p = Popen([script_call, test_file], stdout=PIPE, stderr=PIPE, stdin=PIPE)

                try:
                    p.wait(timeout = zombie_wait)
                    print(p.returncode)
                except subprocess.TimeoutExpired as err:
                    force_kill = True
                    p.kill()
                    zombie_thread_warning(os.path.basename(tup[0]))
                    o = open("grade.txt", "w")
                    o.write("TimeoutExpired ERROR: {0}\n".format(err))
                    o.write("PLEASE CONTACT THE INSTRUCTOR\n")  
                    o.close()

当我在Linux上运行此代码时,我有两个被标记的文件。在Windows上有五个被标记的文件。当我运行我在Popen中调用的脚本时,事实证明Linux编号(只有两个标记文件)是正确的。 Linux是否为Windows不支持的流程做了什么,如果可以的话,我可以将它添加到我的代码中以在两个平台上获得相同的结果吗?

编辑:我在我的代码后面的Popen中使用stdout和stderr,使用:

                    p.stdout
                    p.stderr

1 个答案:

答案 0 :(得分:1)

如果使用PIPE,您应该从管道中读取,否则子进程可能会阻塞并发生超时 - 目前尚不清楚是否属于这种情况 - 管道缓冲区在不同平台上可能有所不同,环境。

如果你想忽略输出;改为使用DEVNULL

from subprocess import DEVNULL, TimeoutExpired, call

try:
    rc = call([script_call, test_file], timeout=zombie_wait,
              stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
except TimeoutExpired as error:
    force_kill = True #XXX do you need it?
    zombie_thread_warning(os.path.basename(tup[0])) 
    with open('grade.txt', 'a') as file: # append multiple errors
        print("{test_file} timed out: {error}".format(**vars()),
              "PLEASE CONTACT THE INSTRUCTOR", sep='\n', file=file)
else:
     print("return code", rc)