对循环中Python子进程感到困惑

1 投票
1 回答
2244 浏览
提问于 2025-04-16 06:08

我正在尝试用Python自动处理一些大数据文件。

处理的过程是串联的,也就是说,脚本1写一个文件,然后脚本2处理这个文件,接着脚本3处理脚本2的输出,依此类推。

我在一个多线程的环境中使用了subprocess模块。

我有一个类,它创建了一些脚本的元组,比如("scr1.sh","scr2.sh","scr3.sh")。

然后还有另一个类,它使用类似下面的调用:

for script in scriplist:
    subprocess.call(script)

我想问的是,在这个for循环中,是否每个脚本只有在subprocess.call(script1)返回成功的状态码后才会被调用?

还是说因为我使用了subprocess.call,所以三个脚本会一个接一个地被调用,而不需要使用"sleep"或"wait"?我想确保第二个脚本只有在第一个脚本完成后才开始运行。

补充说明:pydoc上说

"subprocess.call(*popenargs, **kwargs) 运行命令及其参数。等待命令完成,然后返回返回码属性。"

所以在上面的for循环中,它是否会在迭代下一个脚本之前等待每个返回码?

我对多线程还很陌生。这里附上了运行分析的类的简化代码。subprocess.call循环是这个类的一部分。

class ThreadedDataProcessor(Thread):
            def __init__(self, in_queue, out_queue):
                # Uses Queue 
                Thread.__init__(self)
                self.in_queue = in_queue
                self.out_queue = out_queue
            def run(self):
                while True:
                    path = self.in_queue.get()
                    if path is None:
                        break
                    myprocessor = ProcessorScriptCreator(path)
                    scrfiles = myprocessor.create_and_return_shell_scripts()

                for index,file in enumerate(scrfiles):
                    subprocess.call([file])
                    print "CALLED%s%s" % (index,file) *5
                #report(myfile.describe())
                #report("Done %s" %  path)
                self.out_queue.put(path) 
                in_queue = Queue()

1 个回答

2

这个循环会一个接一个地调用每个脚本,等前一个脚本完成后再调用下一个,不管前一个脚本是成功还是失败。你可能想这样做:

try:
  map(subprocess.check_call, script_list)
except Exception, e:
  # failed script

每次调用run时,都会启动一个新的线程,并且这个线程会在run完成后结束。在一个线程里,你会用子进程来逐个执行脚本。

你需要确保每个线程里的调用不会影响到其他线程里的调用。比如说,如果多个线程同时尝试从脚本中读取和写入同一个文件,这样就会出现问题。

撰写回答