当前位置: 首页 > 面试题库 >

Python子进程调用挂起

归俊杰
2023-03-14
问题内容

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()处理这些问题吗?

在什么情况下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东西只是在日志中转储了一堆空行,这就是为什么我在调试级别记录它。那会在开发期间打印到我的日志中,但是永远不会写在生产中,因此我可以安全地将其保留在代码中进行调试,而无需在其日志中放入垃圾。

希望这可以帮助您揭露程序的挂起位置以及造成该问题的原因。



 类似资料:
  • 问题内容: 我尝试完成的任务是流式处理ruby文件并打印输出。(注意:我不想一次打印出所有内容) main.py puts “hello” 问题 流文件工作正常。打招呼/再见输出将延迟2秒打印。就像脚本应该工作一样。问题是readline()最终挂起并且永不退出。我从来没有达到最后的打印。 我知道这里有很多类似的问题,但是这些都不是让我解决问题的方法。我并不是整个子流程中的人,所以请给我一个更实际

  • 问题内容: 好的,所以我试图从python脚本运行C程序。目前,我正在使用测试C程序: 为了模拟我将要使用的程序,该程序会不断读取传感器的读数。然后,我尝试”2000”使用python中的子进程从C程序读取输出(在本例中为): 但这不起作用。从使用print语句开始,它运行该行,然后在处等待:,直到我按。 为什么是这样?这正是我所看到的大多数示例作为其代码的内容,但是却没有读取该文件。 编辑: 有

  • 导致错误: Traceback(最近一次调用最后一次):文件C:\Program Files(x86)\wing IDE 101 5.0\src\debug\tserver_sandbox.py,第3行,在传递文件c:\Python27\Lib\subprocess.py,第172行,在调用返回Popen(*popenargs,**kwargs). etc()文件c:\Python27\Lib\s

  • #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { pid_t pid; pid = fork(); if (pid < 0) { exit(1); } else if (pid > 0) { exit

  • 问题内容: 我目前正在使用 我对Python相当陌生,但是它“感觉”到应该有一些api可以让我做类似的事情: 我这样做是为了在知道cmd已经退出的情况下可以执行某些操作(例如,对当前正在运行的外部进程数进行计数) 我以为我可以将子流程包装在将线程与方法结合在一起的类中,但是由于我还没有在Python中完成线程,而且对于API来说这似乎很常见,我想我会尝试先找到一个。 提前致谢 :) 问题答案: 您

  • 问题内容: 我试图用一个,但不幸的是它似乎并没有工作时。这是一些示例代码: 此代码的输出是: 我希望可以在和被调用时调用,并且输出将类似于(强调)!: 为什么这不起作用,并且当a终止时是否有更好的方法(从上下文)记录消息? 感谢您的输入-非常感谢。 编辑: 根据亚历克斯·马特利(Alex Martelli)建议的解决方案,以下工作可预期进行: 值得在文档中注意以下注释: 注意:当程序被信号杀死,检