4
Python版本:2.6.7 我在for循环内被exectuted 18倍,然而,过程中不断地悬挂在19环以下subprocess.call:Python的子进程调用挂起
if config.get_bool_option(NAME, 'exclude_generated_code', True):
for conf in desc.iter_configs():
for gen in desc.iter_generators(conf):
generator.initialize_generated_path(gen, desc)
for genpath in gen.generated_path:
os.rename(cov_file, cov_file+'.temp')
exclude = ['lcov']
exclude += ['-r', cov_file+'.temp', '"'+genpath+'/*"']
exclude += ['-o', cov_file]
if verbose: Tracer.log.info("Running "+ ' '.join(exclude))
try:
subprocess.call(' '.join(exclude), stdout=out, stderr=out, shell=True)
except subprocess.CalledProcessError, e:
if verbose: Tracer.log.info("TESTING: Got Exception \n")
控制台输出如下:
Running lcov -r /remote/XXXXXX/coverage.19.temp "/remote/XXXXXX/xml/2009a/generated/*" -o /remote/XXXXX/gcov/coverage.19
因为我不是很熟悉Python脚本,我只是徘徊我是否错在这里做一些事情......我怀疑死锁的地方..
stdout, stderr = process.communicate()
会处理这些问题吗?
任何专家的回答,在哪些情况下,子过程。请挂? 非常感谢
检查第19条命令是否自行挂起,检查可用磁盘空间和/或添加'close_fds = True'参数(确保在循环中释放其他资源)。 – jfs
与悬而未决的问题无关:1.'subprocess.call()'不会引发'CalledProcessError',您可能会将它与'subprocess.check_call()'混淆。2.您可能不需要'shell = True';您可以将该命令作为列表传递。 3.要合并stdout/stderr,你可以设置'stderr = subprocess.STDOUT'。 – jfs