我正在尝试编写一个使用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
答案 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)