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

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

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

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

  1. 使用subprocess.Popenstdout参数将子进程的输出重定向到一个文件对象,然后手动刷新文件对象。示例代码如下:
代码语言:python
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
import subprocess
import sys

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

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

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

相关·内容

Linux 之 详谈系统IO文件及内核级缓冲区(看这一篇就够了)

⽽进程执⾏open系统调⽤,所以必须让进程和⽂件关联起来。...可以看出,缓冲区就是⼀块内存区,它⽤在输⼊输出设备和CPU之间,⽤来缓存数据。它使得低速的输⼊输出设备和⾼速的CPU能够协调⼯作,避免低速的输⼊输出设备占⽤CPU,解放出CPU,使其能够⾼效率⼯作。...⾏缓冲区:在⾏缓冲情况下,当在输⼊和输出中遇到换⾏符时,标准I/O库函数将会执⾏系统调⽤操作。当所操作的流涉及⼀个终端时(例如标准输⼊和标准输出),使⽤⾏缓冲⽅式。...⽽我们放在缓冲区中的数据,就不会被⽴即刷新,甚⾄fork之后 但是进程退出之后,会统⼀刷新,写⼊⽂件当中。...由于进行了fork()创建了新的进程, 代码和数据子进程会进行拷贝, 形成自己独立的一份, 因为此时是普通文件, 普通文件会写满刷新, 所以父子进程结束时都会进行文件缓冲区的刷新, 所以就会形成两份,

5500

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

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

7.6K10
  • 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

    3.1K20

    linux日志切割神器logrotate

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

    1.4K11

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

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

    1.2K30

    Linux探秘坊-------7.进程概念

    1.进程概念 1.冯诺依曼体系结构 输⼊单元:包括键盘,⿏标,扫描仪,写板等 中央处理器(CPU):含有运算器和控制器等 输出单元:显⽰器,打印机等 这⾥的存储器指的是内存 ⼀句话,所有设备都 只能直接和内存打交道...系统调⽤ 在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤, 这部分由操作系统提供的接⼝,叫做系统调⽤。...系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部 分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开 发。...这些蓝色的文件都是目录,我们只需要找到我们需要的文件的id文件就行,刚刚为了演示杀掉了一次进程,现在id为907 如果程序退出,那么它就不再是一个进程了,就不会有id了 cwd - 记录进程路径 exe...因为在fork函数里在return前子进程已经创建,所以父和子进程都走了一遍return,所以会返回两次 小结论:进程具有独立性 以上代码中子进程会把gval修改,但父进程中gval不会改变 可以理解为

    5300

    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.4K20

    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

    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.4K40

    《理解 Unix 进程》笔记-1

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

    91310

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

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

    70310

    Node.js的底层原理

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

    2.1K20

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

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

    2.7K30

    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.2K20

    缓冲区的设计与实现

    通过库函数printf打印的信息并没有打印在文件内,原因是如果添加close(fd)的话,在关闭文件之前并没有触发将用户缓冲区内容刷新到文件缓冲区的条件。...之后因为文件已经,即使进程结束触发刷新条件也不会进行刷新,所以就会造成这种结果。 另外可以发现,所有的操作都是将数据向不同的目标进行拷贝。 所以,计算机数据流动的本质:一切皆拷贝!...读写⽂件时,如果不会开辟对⽂件操作的缓冲区,直接通过系统调⽤对磁盘进⾏操作(读、写等),那么每次对⽂件进⾏⼀次读写操作时,都需要使⽤读写系统调⽤来处理此操作,即需要执⾏⼀次系统调⽤,执⾏⼀次系统调⽤将涉及到...可以看出,缓冲区就是⼀块内存区,它⽤在输⼊输出设备和CPU之间,⽤来缓存数据。...重定向后没有库函数的缓冲区没有刷新,所以会在fork后父进程和子进程各执一份库函数的缓冲区,当程序结束后触发刷新,将两个进程的缓冲区都进行刷新,引发写时复制(COW)。

    11810

    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.5K20

    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)。

    6.2K50
    领券