在cmd中通过Python运行工具不等待

在cmd中通过Python运行工具不等待,python,windows,process,cmd,subprocess,Python,Windows,Process,Cmd,Subprocess,我正在通过cmd中的Python运行一个工具。对于给定目录中的每个示例,我希望该工具能够有所作为。但是,当我在循环中使用process=subprocess.Popen(command)时,命令不会一直等到完成,一次会产生10个提示。当我使用subprocess.Popen(command,stdout=subprocess.PIPE)时,命令仍然是黑色的,我看不到进度,尽管它会一直等到命令完成 是否有人知道如何通过cmd中的Python调用外部工具,该工具会一直等到命令完成,并且能够在cmd中

我正在通过
cmd
中的
Python
运行一个工具。对于给定目录中的每个示例,我希望该工具能够有所作为。但是,当我在循环中使用
process=subprocess.Popen(command)
时,命令不会一直等到完成,一次会产生10个提示。当我使用
subprocess.Popen(command,stdout=subprocess.PIPE)
时,命令仍然是黑色的,我看不到进度,尽管它会一直等到命令完成

是否有人知道如何通过
cmd
中的
Python
调用外部工具,该工具会一直等到命令完成,并且能够在
cmd
中显示工具的进度

#main.py
        for sample in os.listdir(os.getcwd()):
            if ".fastq" in sample and '_R1_' in sample and "Temp" not in sample:
                print time.strftime("%H:%M:%S")
                DNA_Bowtie2.DNA_Bowtie2(os.getcwd()+'\\'+sample+'\\'+sample)

#DNA_Bowtie2.py
            # Run Bowtie2 command and wait for process to be finished.
            process = subprocess.Popen(command, stdout=subprocess.PIPE)
            process.wait()
            process.stdout.read()

Edit:command=一个perl或java命令。在上面的构造中,我看不到工具输出,因为提示符(perl窗口或java窗口)仍然是黑色的。

这里的顺序很重要:首先读取输出,然后等待

如果您这样做:

process.wait()
process.stdout.read()
如果管道缓冲区已满,您可能会遇到死锁:子进程在等待标准输出时阻塞,永远不会到达末尾;程序在
wait()
时阻塞,永远不会到达
read()

取而代之

process.stdout.read()
process.wait()
它将一直读到EOF

如果您想要进程的stdout,则此选项适用

如果您不想这样做,那么应该省略
stdout=PIPE
内容。然后将输出定向到该提示窗口。然后还可以省略
process.stdout.read()


通常,
process.wait()
会阻止10个实例同时运行。如果这不起作用,我不知道为什么不…

看起来您的子流程会分叉,否则等待()将无法在流程完成之前返回。

process.communicate()
应该等待流程完成。这导致至少10个流程(目录中还有10个示例)。而不是1乘1。所以这不起作用。process=subprocess.Popen(command)process.communicate(),所以您希望它被阻塞,那么wait()应该是解决方法。不知道为什么它对你不起作用。您是否尝试过使用
subprocess.call(command)
我可以阻止进程,直到它们完成。(process.wait())。但是在当前的配置下,我看不到工具输出,我看到的只是一个黑屏。当我仅仅应用(subprocess.Popen(command))时,我看到了输出,但是process.wait()仍然不起作用。这是有效的,唯一的一点是,当应用process=subprocess.Popen(command,stdout=subprocess.PIPE)时,Java提示符显示不显示process。提示将保持黑色,并在流程完成时关闭。我仍然看不到输出。@user3589561我扩展了我的答案。我可以阻止进程,直到它们完成。(process.wait())。但是在当前的配置下,我看不到工具输出,我看到的只是一个黑屏。当我只是应用(subprocess.Popen(command))时,我看到了输出,但是process.wait()仍然不起作用。我似乎不明白您的问题。I read()/wait()的任何顺序都不会有并发。只是wait()/read()不起作用。当然,除了在程序中运行并发之外。