首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python子进程在循环中调用时不会输出到文件

的原因是因为子进程的输出默认是通过标准输出(stdout)进行的,而在循环中调用子进程时,标准输出并不会立即刷新到文件中,而是在缓冲区中累积一定量的数据后才会进行刷新。

要解决这个问题,可以通过以下几种方式:

  1. 使用subprocess.Popenstdout参数将子进程的输出重定向到一个文件对象,然后手动刷新文件对象。示例代码如下:
代码语言:python
复制
import subprocess

with open('output.txt', 'w') as f:
    process = subprocess.Popen(['command'], stdout=f)
    while True:
        # 循环中的其他操作
        f.flush()  # 刷新文件对象
  1. 使用subprocess.Popenuniversal_newlines=True参数,将子进程的输出转换为文本模式,这样输出会立即刷新到文件中。示例代码如下:
代码语言:python
复制
import subprocess

with open('output.txt', 'w') as f:
    process = subprocess.Popen(['command'], stdout=f, universal_newlines=True)
    while True:
        # 循环中的其他操作
  1. 在循环中使用sys.stdout.flush()手动刷新标准输出。示例代码如下:
代码语言:python
复制
import subprocess
import sys

process = subprocess.Popen(['command'], stdout=subprocess.PIPE)
while True:
    # 循环中的其他操作
    sys.stdout.flush()  # 刷新标准输出

以上是解决子进程在循环中调用时不会输出到文件的几种方法,根据具体情况选择适合的方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

异步,同步,阻塞,非阻塞程序的实现

如果是同步,线程会等待接受函数的返回值(或者轮函数结果,直到查出它的返回状态和返回值)。如果是异步,线程不需要做任何处理,函数执行完毕后会推送通知或者调用回函数。...线程同步调用下,也能非阻塞(同步轮非阻塞函数的状态),异步下,也能阻塞(调用一个阻塞函数,然后函数中调用回,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞的sleep。...最后利用Python的特性,将callback调用方式改为yield的伪同步调用。...上面的代码中,一个while循环中timer的状态。由于timer存在于wait中。所以需要把timer“提取”出来。...由于my_sleep新线程中执行,所以它不会阻塞住主线程。 my_sleep结束时,调用回函数。使得任务继续进行。 也就是说,每个要处理阻塞的地方,都人为的把函数切成三个部分: 1.

7.5K10

python的subprocess模块

需要说明的是,该方法python3.x中才有。 call()方法启动的进程,其标准输入输出会绑定到父进程的输入和输出。调用程序无法获取命令的输出结果。...python3中结果为byte类型,要得到str类型需要decode转换一下 直接执行命令输出到屏幕 ​ subprocess.Popen("ls -l",shell=True) ​ <subprocess.Popen...ID Popen.returncode 获取进程状态码,0表示进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),...平台下有效,用于指定一个可执行对象,它将在进程运行之前被调用 close_sfs:Windows平台下,如果close_sfs被设置为True,则新创建的进程不会继承父进程的输入、输出、错误管道...如果env=None,进程的环境变量将从父进程中继承 universal_newlines:不同系统的换行符不同,True->同意使用\n startupinfo与createionflags只Windows

3K20

linux日志切割神器logrotate

文件件名并不在元数据里而是目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。 借《UNIX 环境高级编程》里的图说一下进程打开文件的机制。...表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT…)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程不会共用同一个文件表。...正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。...compress: 任务完成后,已轮的归档将使用 gzip 进行压缩。...missingok: 日志轮期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。 notifempty: 如果日志文件为空,轮不会进行。

1.2K11

python中的asyncio使用详解与异步协程的处理流程分析

,则不会运行协程函数,由于主线程跑完了,线程也就被销毁了,如代码写成这样: 图片 得到的输出是 图片 所以想要使得协程函数得到执行,需要调用事件循环来执行任务,上面的loop.run_until_complete...事件循环中动态的添加同步函数 解决方案是,先启一个线程,这个线程用来跑事件循环loop,然后动态的将同步函数添加到事件循环中 图片 由于使用ping 命令得到很多输出,所以我对函数稍稍做了修改,只是模拟打印了一行文字...图片 这里初始化了两个执行器,一个是线程的,一个是进程的,它们执行的效果一样,只是一个跑了多线程,一个跑了多进程。...事件循环中动态的添加异步函数 通过asyncio.run_coroutine_threadsafe 方法来动态的将一个协程绑定到事件循环上,并且不会阻塞主线程 图片 通过asyncio.run_coroutine_threadsafe...loop上绑定了四个协程函数,得到的输出结果为 图片 主线程不会被阻塞,起的四个协程函数几乎同时返回的结果,但是注意,协程所在的线程和主线程不是同一个线程,因为此时事件循环loop是放到了另外的线程中跑的

99730

python日志syslog运用

syslog的官方说明: https://docs.python.org/2/library/syslog.html#module-syslog 该模块的主要方式为: #!...# LOG_NDELAY:立即打开与系统日志的连接(通常情况下,只有产生第一条日志信息的情况下才会打开与日志系统的连接) # LOG_NOWAIT:在记录日志信息时,不等待可能的进程的创建...# LOG_ODELAY:类似于LOG_NDELAY参数,与系统日志的连接只有syslog函数调用时才会创建 # LOG_PID:每条日志信息中都包括进程号 # LOG_PID...# LOG_NDELAY:立即打开与系统日志的连接(通常情况下,只有产生第一条日志信息的情况下才会打开与日志系统的连接) # LOG_NOWAIT:在记录日志信息时,不等待可能的进程的创建...# LOG_ODELAY:类似于LOG_NDELAY参数,与系统日志的连接只有syslog函数调用时才会创建 # LOG_PID:每条日志信息中都包括进程号 cons = syslog.LOG_CONS

1.3K20

Nodejs与Python脚本语言混编

Nodejs必要模块child_process 实现原理非常简单,使用child_process这个模块其实是帮助开发者nodejs环境中建立一个进程。...child_process 模块详解 child_process 是用于生成进程的重要模块,它提供了调用进程的方法以及传递参数给进程的方法,其重要的属性以及函数可以参考官方的API:https:/...这个模块中的argv属性是一个list,存放使用系统命令行运行python脚本时传入的参数和脚本文件的名称,当然argv的第一个值即是脚本名称,从第二个值往后才是命令行传入的参数,上述代码运行效果如下:...: image.png 我们可以看到从python脚本输出到控制台的内容nodejs的程序中被完全解析为字符串,存放于回函数的输入参数stdout中。...小结 nodejs 调用脚本与其他脚本的交互过程主要就是三步:javascript代码中使用child_process模块创建进程进程调用命令行并且传递参数完成其他语言脚本代码的调用,根据其他语言的控制台输出的字符串进行

6.3K40

自带的 print 函数居然会报错?

线上修复时我没有采用这个方案,为了方便查看日志,还是使用标准的日志框架将日志输出到了 es 中,方便统一 kibana 中进行查看。 由于日志框架并没有使用到管道,所以自然也不会有这个问题。...父进程进程: 可以看到进程的标准输出与父进程关联,也就是 popen() 所返回的那个文件描述符。...还有一点需要注意的是,当我们进程中打开的文件描述符,进程也会继承过去; 比如在 task.py 中新增一段代码: x = open("1.txt", "w") 之后查看文件描述符时会发现父子进程都会有这个文件...: 但相反的,进程中打开的文件进程不会有的,这个应该很容易理解。...父子进程是通过匿名管道进行通信的,当读取端关闭时,写入端输出到达管道最大缓存时会收到 SIGPIPE 信号,从而抛出 Broken pipe 异常。 进程会继承父进程文件描述符。

66310

Android 开发艺术探索笔记二

Looper用来处理消息,以无限坏的方法是查看是否有新的消息,有的话就进行处理,否则一直处于等待。还有一个特殊的概念ThreadLocal,作用可以每个线程中存储数据。...通过Looper.prepare()创建Looper,Looper.loop()开启消息坏 可以主线程中创建Looper调用prepareMainLooper,调用getMainLooper主线程获取...loop方法是一个死循环,只有MessageQueue的next方法返回为空时,才会跳出坏,所以不使用时必须通过quit或者quitSafely退出循环,否则会造成内存泄漏等其他问题 Handler工作原理...ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信方式完成ActivityThread请求回ApplicationThread的binder方法...HandlerThread 它继承自Thread,run方法中通过Looper.prepare创建消息队列,通过Looper.loop开启消息坏。

1.8K10

《理解 Unix 进程》笔记-1

无论何时进程中打开一个资源,你都会获得一个文件描述符编号(file description number)。文件描述符并不会在无关进程之间共享,它只存在于其所属的进程之中。 #!...,进程结束之前,python 会调用 atexit 所定义的语句。...进程拥有自己唯一的 pid 进程的ppid 就是调用 fork 的进程的 pid fork 调用时进程从父进程处继承了所有的文件描述符,也获得了父进程所有的文件描述符编号。...这样,两个进程就可以共享打开的文件、套接字等。 进程继承了父进程内存中所有的数据 进程可以随意更改其内存内容的副本,而不会对父进程造成影响。 #!...通过打印结果会发现,运行程序父进程结束后,立刻放回到终端命令提示符下,此时终端被子进程出到 STDOUT 的内容重写了。 父进程结束后,进程并不好退出,还是会继续运行。

87010

Node.js的底层原理

check、idle、prepare阶段 check、idle、prepare阶段相对比较简单,每个阶段维护一个队列,然后处理对应阶段的时候,执行队列中每个节点的回,不过这三个阶段比较特殊的是,队列中的节点被执行后不会被删除...同步创建进程会导致主进程阻塞,具体的实现是 1 主进程中会新建一个新的事件循环结构体,然后基于这个新的事件循环创建一个进程。 2 然后主进程就在新的事件循环中执行,旧的事件循环就被阻塞了。...首先我们看一下文件系统和进程的关系,操作系统中,当进程打开一个文件的时候,他就是形成一个fd file inode这样的关系,这种关系fork进程的时候会被继承。 ?...但是如果主进程fork进程之后,打开了一个文件,他想告诉进程,那怎么办呢?如果仅仅是把文件描述符对应的数字传给进程进程是没有办法知道这个数字对应的文件的。...4 这时候主进程就会创建一个socket,并绑定地址。但不会把它置为监听状态,而是把这个socket通过文件描述符的方式返回给进程。 5 当连接到来的时候,这个连接会被某一个进程处理。

1.9K20

干货!!字节大佬带你深入分析Node.js的底层原理

,队列中的节点被执行后不会被删除,而是一直队列里,除非显式删除。...然后主进程就在新的事件循环中执行,旧的事件循环就被阻塞了。 进程结束的时候,新的事件循环也就结束了,从而回到旧的事件循环。 5.2 进程间通信 接下来我们看一下父子进程间怎么通信呢?...首先我们看一下文件系统和进程的关系,操作系统中,当进程打开一个文件的时候,他就是形成一个fd->file->inode 这样的关系,这种关系 fork 进程的时候会被继承。...但是如果主进程 fork 进程之后,打开了一个文件,他想告诉进程,那怎么办呢?如果仅仅是把文件描述符对应的数字传给进程进程是没有办法知道这个数字对应的文件的。...但不会把它置为监听状态,而是把这个 socket 通过文件描述符的方式返回给进程。 当连接到来的时候,这个连接会被某一个进程处理。 8. Libuv线程池 为什么需要使用线程池?

1.9K30

2.并发编程多编程

一 multiprocessing模块介绍 ​ python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),python中大部分情况需要使用多进程。...因此,UNⅨ提供了一种机制可以保证父进程可以在任意时刻获取进程结束时的状态信息: 1、每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。...,原因是:生产者p在生产完后就结束了,但是消费者c取空了q之后,则一直处于死循环中且卡在q.get()这一步。...,他只能是你任务函数func1的函数的返回值 # for i in range(10,20): #如果是多个进程来执行任务,那么当所有进程将结果给了回函数之后,回函数又是进程上执行的,...: 11852 #发现回函数是进程中完成的,其实如果是进程中完成的,那我们直接将代码写在进程的任务函数func1里面就行了,对不对,这也是为什么称为回函数的原因。

1.1K20

Android为什么不能在线程更新UI

为什么还需要开启消息坏 使用线程更新UI有实际应用场景吗 Android为什么不能在线程更新UI? // Android中为什么子线程不能更新UI?...所以干脆使用单线程模型处理UI操作,使用时用Handler切换即可 为什么一开始Activity的onCreate方法中创建一个线程访问UI,程序还是正常能跑起来呢 // 为什么一开始Activity...因为ViewRootImpl 的创建在 onResume 方法回之后,而我们一开篇是 onCreate 方法中创建了线程并访问 UI,在那个时刻,ViewRootImpl 还没有创建,我们因此...因为 checkThread 方法不会被执行到。 ViewRootImpl 创建完成之后,保证「创建 ViewRootImpl 的操作」和「执行修改 UI 的操作」同一个线程即可。...为什么还需要开启消息坏 // 保证上述条件1成立,不就可以避免checkThread时候抛出异常了吗?为什么还需要开启消息坏?

1.4K20

nodejs中如何使用流数据读写文件

function( req, res ){} )中的req对象就是典型的http.IncommingMessage对象 net.Socket对象,即一个socket端口对象 child.stdout对象,用于创建进程的标准输出流...child.stderr对象,用于创建进程的标准错误输出流 process.stdin对象,用于创建进程的标准输入流 Gzip/Deflate/DeflateRaw对象,用于实现数据压缩 以上这些实现了...这会迫使操作系统缓存区中的剩余数据被立即写入目标对象中,当该方法被调用时,将不能继续目标对象中写入数据。...// 使用整数值来指定文件的结束位置,单位为字节数 } 当文件被打开时,将触发ReadStream对象的open事件,该事件触发时调用的回函数可以使用一个参数,参数值是被打开文件文件描述符(也即文件句柄...属性设为 a } ) 当文件被打开时,将触发WriteStream对象的open事件,该事件触发时调用的回函数可以使用一个参数,参数值是被打开文件文件描述符(也即文件句柄fd)。

5.9K50

subprocess 使用总结

subprocess.PIPE 表示一个可以被用于Popen的stdin 、stdout 和stderr 3个参数的特值,表示需要创建一个新的管道。...2.Popen的方法: Popen.poll(), 用于检查进程是否已经结束。设置并返回returncode属性。 Popen.wait(), 等待进程结束。设置并返回returncode属性。...Popen.pid,获取进程进程ID。 Popen.returncode, 获取进程的返回值。如果进程还没有结束,返回None。...3.stdin, stdout and stderr详细介绍 Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,也就是stdin, stdout and stderr这三个。...进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

1.7K30

ES6学习笔记(一)

命令所在的代码块内有效,let很合适用于循环的计数器,for循环中设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的作用域....参数默认是不传值的, 而是每次都重新计算默认值,表达式的值,参数默认值是惰性求值,参数默认值可以与结构赋值的默认值结合起来使用,通常情况,定义了默认值的函数应该是函数的尾参数, 因为这样比较容易看出到底省略了那些参数...,如果函数传入undefined将触发默认参数值,而null不会触发....es6允许使用箭头=>定义函数,如果箭头函数不需要参数或需要多个参数就使用一个圆括号代表参数部分,箭头函数可以与变量结构使用,箭头函数可以简化函数回函数,使用时需注意几点 1:函数体内的this对象...,就是定义时所在的对象而不是使用时所在的对象 2:不可以当做构造函数,也就是说,不可以使用new命令 否则报错 3:不可以使用arguments对象,该对象函数体内不存在,可用rest参数代替

18510

进程、协程、事件驱动及select poll epoll

\python.exe D:/python培训/s14/day10/进程访问父进程数据.py 2 [11, None, 'hello'] 3 4 Process finished with exit...事件驱动版本的程序中,3个任务交错执行,但仍然一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回描述了该如何处理某个事件。...另外,select()和poll()将就绪的文件描述符告诉进程后,如果进程没有对其进行IO操作,那么下次调用select()和poll()的时候将再次报告这些文件描述符,所以它们一般不会丢失就绪的消息,...,这里也使用了内存映射(mmap)技术,这样便彻底省掉了这些文件描述符系统调用时复制的开销。...callback的回机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知 以select方法为例子进行理解 Python的select()方法直接调用操作系统的IO接口,它监控

2.1K90

狼厂项目实践:通用检索框架准实时流的设计与实现

检索的数据流主要包括全量数据与增量数据,其中全量数据是在运行前就已经生成好的,检索进程运行开始时就直接解析加载了,后面不会再产生,所以不会对录入有高实时性的需求;而增量数据理论上整个检索进程运行过程中随时都可能新增...具体实现 糯米现有检索框架一般都是一个单独的线程中监控文件变化,通过回实现增量数据加载。主线程只需在其时传入需要的配置以及对数据进行处理的回函数即可,耦合度很低。...之后注册监控的回函数,文件夹inode发生变化时,会触发raise唤醒wait中的处理线程,从指定行开始逐个字节读文件,每读完一条数据就进行一次处理,读完整个文件后,就wait直到下个文件产生。...StartSubscribe主要包含两个方法:获取要订阅的消息队列的通道的数量,然后对每个子通道发起订阅请求。 之后进入SubscribeMainloop,while循环中接收、处理数据。...而使用消息队列更新一条数据的用时0.5秒以内,更新1000条数据也可在2秒以内完成,实现了准实时流,值得全面推广检索框架的增量数据录入部分使用。

41410
领券