在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()不起作用。当然,除了在程序中运行并发之外。