Subprocess.Popen标准输出,等待程序完成 - python

我正在通过subprocess.Popen运行程序,遇到一个意外问题,其中stdout不能实时打印,而是等待程序完成。奇怪的是,这仅在使用Python编写被调用程序时发生。

我的控制程序(一个使用子过程的程序)如下:

import subprocess
import os
print("Warming up")
pop = subprocess.Popen("python3 signaler.py", shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
for line in pop.stdout:
    print(line)
print("I'm done")

Signaler.py:

import time
print("Running")
time.sleep(5)
print("Done running")

当我运行控制程序时,输出如下。该代码在打印Running之前要等待5秒钟,尽管事实是print("Running")出现在实际延迟之前。

Warming up
*waits 5 seconds*
b'Running\n'
b'123\n'
I'm done

奇怪的是,当我修改控制程序以改为运行Node程序时,延迟功能按预期方式运行,并且RunningDone Running前5秒钟打印出来。 Node程序如下:

const delay = require("delay")
async function run(){
console.log("Running")
await delay(5000)
console.log("Done running")
}
run()

当我使用os.system调用signaler.py时不会发生此问题,而在运行shell=False并如此修改参数时仍然会发生此问题。任何想法是什么原因造成的?

参考方案

听起来像python正在缓冲print函数的输出,而javascript不是。您可以通过在signaler.py中使用flush关键字调用将打印语句刷新到stdout。

print("Running", flush=True)

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…