Python版本:2.6.7 我在for循环中有以下subprocess.call,该循环被执行18次,但是,该过程始终挂在第19个循环上:
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()处理这些问题吗?
stdout, stderr = process.communicate()
在什么情况下subprocess.call会挂起任何专家答案?非常感谢
当使用子过程时,我倾向于做这样的事情:
is_running = lambda: my_process.poll() is None my_process = subprocess.Popen(' '.join(exclude), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) # Grab all the output from stdout and stderr and log it while is_running(): rlist, wlist, xlist = select.select([my_process.stdout, my_process.stderr], [], [], 1) # Log stdout, but don't spam the log if my_process.stdout in rlist and verbose: # Adjust the number of bytes read however you like, 1024 seems to work # pretty well for me. Tracer.log.debug(my_process.stdout.read(1024)) # Log stderr, always if my_process.stderr in rlist: # Same as with stdout, adjust the bytes read as needed. Tracer.log.error(my_process.stderr.read(1024))
我以前看过stdout东西只是在日志中转储了一堆空行,这就是为什么我在调试级别记录它。那会在开发期间打印到我的日志中,但是永远不会写在生产中,因此我可以安全地将其保留在代码中进行调试,而无需在其日志中放入垃圾。
希望这可以帮助您揭露程序的挂起位置以及造成该问题的原因。