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

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

根据官方文档的解释,该函数会执行 fork 一个进程执行 command 这个命令,同时将进程的标准输出通过管道连接到父进程; 也就该方法返回的文件描述符。...如果不需要子进程的输出,也可以将 command 的标准输出重定向到 /dev/null。 也可以使用 Python3 的 subprocess.Popen 模块来运行。...线上修复我没有采用这个方案,为了方便查看日志,还是使用标准的日志框架将日志输出到了 es ,方便统一 kibana 中进行查看。 由于日志框架并没有使用管道,所以自然也不会有这个问题。...总结 一些基础知识排查一些诡异问题显得尤为重要,比如本次涉及到的父子进程管道通信,最后来总结一下: os.popen() 函数是异步执行的,如果需要拿到进程的输出,需要自行调用 read() 函数...父子进程通过匿名管道进行通信的,当读取端关闭,写入端输出到达管道最大缓存时会收到 SIGPIPE 信号,从而抛出 Broken pipe 异常。 进程会继承父进程的文件描述符。

66210

【module】subprocess

*等subprocess通过进程来执行外部指令,并通过input/output/error管道,获取进程的执行的返回信息。...直接使用Popen会对如何运行命令以及如何处理其输入输出有更多控制。如通过为stdin, stdout和stderr传递不同的参数。...与进程的单向通信:通过Popen()方法调用命令后执行的结果,可以设置stdout值为PIPE,再调用communicate()获取结果,返回结果为tuple....python3结果为byte类型,要得到str类型需要decode转换一下 输出结果(读) # 直接执行命令输出到屏幕 >>> subprocess.Popen("ls -l",shell=True...ID Popen.returncode 获取进程状态码,0表示进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),

1.8K40
您找到你想要的搜索结果了吗?
是的
没有找到

python的subprocess模块

说明: Python 3.5之后的版本,官方文档中提倡通过subprocess.run()函数替代其他函数来使用 ​ ​subproccess模块的功能; ​ Python 3.5之前的版本,我们可以通过...0) subprocess.call():执行命令,并返回执行状态,其中shell参数为False命令需要通过列表的方式传入,当shell为True,可直接传入命令 call()方法的command...ID Popen.returncode 获取进程状态码,0表示进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),...PIPE 再给stdout python和shell是两个进程不能独立通信,必须通过操作系统提供的管道 ​ 用管道可以把结果存到stdin stdout stderr ​ subprocess.popen...平台下有效,用于指定一个可执行对象,它将在进程运行之前被调用 close_sfs:Windows平台下,如果close_sfs被设置为True,则新创建的进程将不会继承父进程的输入、输出、错误管道

3K20

PyHero爱之初体验(上)~

1.urllib是Python请求url连接的官方标准库,Python2主要为urllib和urllib2,Python3整合成了urllib。...Python内置库:threading(多线程操作) Python的线程操作旧版本中使用的是thread模块Python2.7和Python3引入了threading模块,同时thread...3.python commands 模块 commands 模块 通过python调用系统命令 只适用于linux commands是提供linux系统环境下支持使用shell命令的一个模块 那我是不是得删除呢...像Linux进程那样,一个进程可以fork一个进程,并让这个子进程exec另外一个程序。Python,我们通过标准库的subprocess包来fork一个进程,并运行一个外部的程序。...subprocess包定义有数个创建进程的函数,这些函数分别以不同的方式创建进程,所以我们可以根据需要来从中选取一个使用

52860

进程通信-管道

进程间的通信方式主要有以下几种: 管道 消息队列 共享内存 信号量 信号 Socket 管道 管道的数据传输方向是单向的,如果两个进程之间需要互相传递数据,那么需要创建两个管道才可以。...匿名管道只存在于内存,不存在于文件系统。 这里的管道就是内核里面的一串缓存。管道传输的数据无格式但是大小受限。...父子进程间如何使用匿名管道通信 我们需要通过fork来创建进程,创建的进程会复制父进程的文件描述符,这样父子进程之间都会有fd[0]和fd[1],父子进程通过各自的fd写入和读取同一个管道文件就可以实现跨进程通信...但是执行上述命令(A|B),由于A进程和B进程都是由shell创建出来进程,A和B之间不存在父子关系,它们父进程都是shell。...它的管道读写图如下: 命名管道 命名管道可以不相关的进程之间能互相通信,因为命令管道需要提前创建一个类型为管道的设备文件,进程里只要使用这个设备文件,就可以互相通信。

72910

Python调用外部系统命令

本文分析python调用外部系统命令主要从两个方面考虑:1、是不是可以返回命令执行结果码,因为大部分场景都需要通过判断调用命令是执行成功还是失败。2、是不是可以获取命令执行结果。...subporcess模块可以调用外部系统命令来创建新进程,同时可以连接到进程的nput/output/error管道上,并得到进程的返回值。...默认值为None,表示从父进程继承。shell Linux:参数值为False,Linux上通过调用os.execvp执行对应的程序。...preexec_fn 只Unix平台下有效,用于指定一个可执行对象(callable object),它将在进程运行之前被调用cwd设置进程当前目录env env是字典类型,用于指定子进程的环境变量...调用外部系统命令,返回命令执行输出结果,但不返回结果吗import os#学习遇到问题没人解答?

23320

Python 执行系统命令

系统命令 作为胶水语言,Python可以很方便的执行系统命令Python3常用的执行操作系统命令有以下方式 os.system() os.popen() subprocess 模块 os.system...system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个进程系统上执行命令行,进程的执行结果无法影响主进程。...官方推荐使用模块执行系统命令,subprocess模块通过进程来执行外部指令,并通过input/output/error管道,获取进程的执行的返回信息。...一些复杂场景,我们需要将一个进程的执行输出作为另一个进程的输入。另一些场景,我们需要先进入到某个输入环境,然后再执行一系列的指令等。...shell 为True,表示将通过shell来执行 cwd 用来设置当前进程的目录 env 用于指定子进程的环境变量。

1.6K10

Python调用系统命令的六种方法

作为胶水语言,Python可以很方便的执行系统命令Python3常用的执行操作系统命令有os.system()、os.popen()、subprocess.popen()、subprocess.call...os.system() system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个进程系统上执行命令行,进程的执行结果无法影响主进程。...系统下运行 import os os.system('cd /home && mkdir test') 执行多条命令可以使用&&连接 os.popen(command,mode) 这种调用方式是通过管道的方式来实现...官方推荐使用模块执行系统命令,subprocess模块通过进程来执行外部指令,并通过input/output/error管道,获取进程的执行的返回信息。...subprocess.Popen() 使用Popen可以创建进程,并与进程进行复杂的交互。 用法:child = subprocess.Popen(["cmd","arg1"...])

3.6K20

Linux文件类型

二.详解 管道文件 管道分为匿名管道和命名管道管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存传输的,管道进程间通信的一种方式,例如父进程写,进程读。...shell匿名管道就是一个管道符号”|”,例如ls | grep xxx,其中ls对应的进程是这个独立进程的父进程,grep对应的进程进程,父进程进程读。...虽然命名管道文件保留在文件系统,但是这个文件只是使用命名管道的一个入口,使用命名管道传输数据的时候,仍然是在内存中进行的,也就是说并不会因为保留在文件系统上命名管道的效率就低了。...shell,可以使用mknod命令或mkfifo命令创建命名管道写某些特殊需求的shell脚本,命名管道非常有用。...实际上,Bash 4之后就支持协程(使用coproc命令)的功能了(ksh和zsh老早就支持协程),但是协程的需求都能通过命名管道来实现。

3K10

【Linux修炼】15.进程间通信

如何理解命令管道 2.5 进程控制多个子进程 三.命名管道 3.1 预备工作 3.2 命令的命名管道 3.3 命名管道 进程间通信 之前提到过,进程之间具有独立性。...1.2 为什么要有通信 之前所写的C/C++代码,都是单进程的。但实际上,我们完成某种业务内容是需要多进程协同的。...所以管道文件是一个内存级别的文件,不会进行磁盘刷新。 四、匿名管道 经过上面的学习,那如何让两个进程看到同一个管道文件呢?——>通过fork创建进程完成。...2.3 管道的特点 读写特征: 上述代码我们进程sleep(1),实际上这使得父进程read暂停1秒,即在read(读)阻塞;那如果把子进程的sleep去掉,进程sleep(n),那么子进程的缓冲区就会被写满...2.4 如何理解命令管道 对于cat file | grep 'hello命令实际上会作为字符串先被扫描一遍,将出现的 | 记录下来,并创建进程

43400

进程间通信方式有哪些?

它有两个特点: 半双工,即不能同时两个方向上传输数据。有的系统可能支持全双工。 只能在父子进程间。经典的形式就是管道由父进程创建,进程fork进程之后,就可以父子进程之间使用了。...(FILE *stream); system()函数虽然也能够执行系统命令,但是无法获取执行状态码,而执行系统命令本质上就需要创建进程来完成,因此利用管道可以很方便的获取进程的输出内容。...,父进程关闭了写通道,进程关闭读通道;进程管道内写入字符串,而父进程管道读取字符串并输出。...一个终端先运行写进程,然后运行读进程,结果如下: read 18 bytes from pipe :www.yanbinghu.com 我们可以看到,两个没有亲缘关系的进程可以通过FIFO进行通信。...消息队列 消息队列可以认为是一个消息链表,存储在内核进程可以从中读写数据。与管道和FIFO不同,进程可以没有另外一个进程等待读的情况下进行写。

1.6K20

进程之间的通信方式「建议收藏」

,就要创建2个管道 管道分为匿名管道和命名管道 匿名管道只能在父子进程关系之间使用 命名管道,可以不关联的两个进程之间使用,因为它创建了一个类型为管道的设备文件,使用这个设备文件就可以通信。...从管道的一段写入的数据,实际上是缓存在内核的,另一端读取,也就是从内核读取这段数据。另外,管道传输的数据是无格式的流且大小受限。...我们可以使用 fork 创建进程,创建的进程会复制父进程的文件描述符,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了...所以说, shell 里通过「|」匿名管道将多个命令连接在一起,实际上也就是创建了多个子进程,那么我们编写 shell 脚本,能使用一个管道搞定的事情,就不要多用一个管道,这样可以减少创建进程的系统开销...另外,对于命名管道,它可以不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,进程里只要使用这个设备文件,就可以相互通信。

57520

深入探讨进程间通信的重要性:理解不同的通信机制(上)

进程间通信操作系统进程间通信是指不同进程之间进行信息共享、数据传输和消息通知等交互的过程。每个进程创建都有自己独立的虚拟地址空间,但它们共享内核空间。...命名管道具有读写两个端口,进程可以通过打开管道的文件来进行读取或写入。当一个进程写入数据到管道,另一个进程可以从管道读取数据。...使用命名管道前,先需要通过 mkfifo 命令来创建,并且指定管道名字:$ mkfifo myPipemyPipe 是管道的名称, Linux 中一切皆文件的原则下,管道也以文件的形式存在。...我们可以使用 ll 命令查看一下,该文件的类型是 p,表示为管道(pipe)。接下来,我们将数据写入名为 myPipe 的管道执行完写入操作后,你可能会发现命令执行后一直停留在那里。...当调用fork,操作系统会复制当前进程的副本)shell执行A | B命令,A进程和B进程都是由shell创建的进程。A和B之间不存在父子关系,它们的父进程都是shell。

33240

【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

两个不同的进程看到一份公共的资源,如果这个资源是由文件系统提供的,那我们将其称为管道通信,如果是由内核System V通信模块提供的,要注意的是OS不仅仅只有进程管理,文件系统,驱动管理,内存管理等...所以创建匿名管道的过程,父进程首先要以两种方式打开管道文件,以便于继承下去的进程能够继承2种打开方式,这样最后关闭文件描述符的时候,一个关闭读端另一个关闭写端,用剩余的文件描述符完成两个进程间的通信...当父进程向某个子进程发送command code,也就是对应的命令码,每个命令码对应一个需要子进程完成的任务,当父进程没发送command code的时候,其他未接收到命令码的进程则一直进行阻塞等待即可...funcMap数组里面,通过命令码在数组对应的下标然后回调任务函数,进程便完成了任务。...和匿名管道相同的是,进行数据传输,也是内存→内存级别的,不会和磁盘有任何关联,因为struct file{}内部是有自己的内核缓冲区的,两个进程通过这个内核缓冲区就可以完成IPC。

1.2K40

理解NodeJS多进程

NodeJS提供多线程模块worker_threads,其中Woker模块用来创建线程,parentPort用在线程,可以获取主线程引用,线程通过parentPort.postMessage发送数据给主线程...下面介绍NodeJS通过socket、管道、信号实现的进程间通信。...管道本质上就是内核的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符(fd1),一个是输出端的描述符(fd0),可以通过两个描述符往管道写入或者读取数据。...NodeJS也是通过net模块实现管道通信,与socket区别是server listen的和client connect的都是特定格式的管道名。管道的通信效率比较低下,一般不用它作为进程通信方案。...我们看到代码中使用了http.createServer,并监听了端口8000,但实际上进程并未监听8000,net模块的server.listen方法(http继承自net)判断cluster进程不监听端口

1.1K00

Node.js 多进程线程 —— 日志系统架构优化实践

除此之外,进程之间的数据不共享,进程之间的数据传输会造成一定的消耗。   因此,使用进程应充分考虑程序的可靠性、运行效率等,创建适量的进程。...2.1.2 Node.js 提供的实现多进程模块   Node.js 内部通过两个库创建进程:child_process 和 cluster,下文先介绍 child_process 模块。   ...  试想有以下两个独立的进程,它们通过执行两个 js 文件创建,那么如何在它们之间传递信息呢?...共享内存   两个进程之间共享部分内存段,两个进程都可以访问,可用于进程之间的通信。Node.js 暂无原生的共享内存方式,可通过使用 cpp 扩展模块实现,实现较为复杂,在此不再举例。 4....命名管道   命名管道可以不相关的进程之间和不同的计算机之间使用,建立命名管道给他指定一个名字,任何进程都可以使用名字将其打开,根据给定权限进行通信。

1.2K30

因为没答好进程间通信,面试挂了...

使用命名管道前,先需要通过 mkfifo 命令来创建,并且指定管道名字: $ mkfifo myPipe myPipe 就是这个管道的名称,基于 Linux 一切皆文件的理念,所以管道也是以文件的方式存在...我们可以使用 fork 创建进程,创建的进程会复制父进程的文件描述符,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了...所以说如果需要双向通信,则应该创建两个管道。 到这里,我们仅仅解析了使用管道进行父进程进程之间的通信,但是我们 shell 里面并不是这样的。...所以说, shell 里通过「|」匿名管道将多个命令连接在一起,实际上也就是创建了多个子进程,那么我们编写 shell 脚本,能使用一个管道搞定的事情,就不要多用一个管道,这样可以减少创建进程的系统开销...另外,对于命名管道,它可以不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,进程里只要使用这个设备文件,就可以相互通信。

59320

深入理解NodeJS多进程

NodeJS提供多线程模块worker_threads,其中Woker模块用来创建线程,parentPort用在线程,可以获取主线程引用,线程通过parentPort.postMessage发送数据给主线程...下面介绍NodeJS通过socket、管道、信号实现的进程间通信。...管道本质上就是内核的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符(fd1),一个是输出端的描述符(fd0),可以通过两个描述符往管道写入或者读取数据。...NodeJS也是通过net模块实现管道通信,与socket区别是server listen的和client connect的都是特定格式的管道名。管道的通信效率比较低下,一般不用它作为进程通信方案。...我们看到代码中使用了http.createServer,并监听了端口8000,但实际上进程并未监听8000,net模块的server.listen方法(http继承自net)判断cluster进程不监听端口

1.6K20

并发编程~先导篇上

僵尸进程 :一个进程使用fork创建进程,如果子进程退出,而父进程并没有调用wait或waitpid获取进程的状态信息,那么子进程进程描述符仍然保存在系统。这种进程称之为僵死进程。...,管道自动被释放 管道默认是阻塞(读、写两端都阻塞) 管道两个端,一个是读端(readfd,一般都为3),一个是写端(writefd,一般都为4) 单向传输 4的意思是这样的(网上找个图,然后改造一下...or 进程只写,父进程只读 (如果想要相互读写通信~两根管道走起) 简单分析一下 ps aux|grep python ,本来ps aux是准备终端输出的,现在写入内核缓冲区了,grep从内核缓冲区里面读取...1次(队列和栈都这样) 匿名管道必须有血缘关系的进程才能通信 半双工通信:同一刻里,信息只能有一个传输方向(类似于对讲机) 单工通信:消息只能单方向传输(类似于遥控器) 半双工通信:类似于对讲机 双工通信...(数据就放在里面) 半双工通信:同一刻里,信息只能有一个传输方向(类似于对讲机) fifo要求读写双方必须同时打开才可以继续进行读写操作,否则打开操作会堵塞直到对方也打开 如果读端全部关闭,管道破裂,

1.8K80
领券