p = subprocess.Popen(cmd, shell=True, cwd=self.cwd, stdout=sys.stdout, stderr=sys.stderr)
在Python中,`subprocess.Popen` 是一个用于创建子进程的函数,它允许你运行外部命令或者程序。`cmd` 参数是要执行的命令,可以是字符串或者命令列表。`shell=True` 表示命令将在shell中执行,这通常用于执行复杂的shell命令。
`stdout` 和 `stderr` 参数是 `Popen` 函数中用来控制子进程的标准输出和标准错误的。默认情况下,子进程的标准输出和错误会被重定向到 `subprocess.PIPE`,这意味着你可以从Python程序中捕获它们。但是,如果你将它们设置为 `sys.stdout` 或 `sys.stderr`,那么子进程的输出和错误将会直接发送到当前Python进程的标准输出和错误流中,这通常是你的终端或者控制台。
- `stdout=sys.stdout`:这会将子进程的标准输出重定向到当前Python进程的标准输出。这意味着子进程产生的任何输出都会直接出现在你的终端上,就像你在终端直接运行命令一样。
- `stderr=sys.stderr`:这会将子进程的标准错误重定向到当前Python进程的标准错误。这意味着子进程产生的错误信息也会直接出现在你的终端上。
举个例子,假设你有一个Python脚本,你想在其中运行一个外部命令,比如 `ls` 命令(在Unix-like系统中列出目录内容),并且你想看到命令的输出和错误信息。
import subprocess
import sys
cmd = "ls /nonexistentdirectory"
# 创建子进程,将输出和错误直接打印到终端
p = subprocess.Popen(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
# 等待子进程完成
p.wait()
在这个例子中,如果 `/nonexistentdirectory` 目录不存在,`ls` 命令将会失败,并且错误信息将会通过 `stderr` 参数重定向到Python进程的标准错误流中,也就是你的终端。这样,你将会在终端看到类似于 "ls: cannot access '/nonexistentdirectory': No such file or directory" 的错误信息。
使用 `stdout=sys.stdout` 和 `stderr=sys.stderr` 的好处是简单直接,你不需要额外的代码来捕获和处理子进程的输出和错误。但是,这也意味着你失去了对这些输出和错误的控制,比如你不能将它们保存到文件中或者进行进一步的处理。如果你需要对输出和错误进行更复杂的处理,你可能需要将它们重定向到 `subprocess.PIPE`,然后使用 `p.stdout.read()` 和 `p.stderr.read()` 来获取输出和错误信息。
subprocess
模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
使用
subprocess
模块
subprocess
模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用
Popen
接口。
run 方法语法格式如下:
subprocess
.
run(args, *, stdin=None, input=None,
stdout
=None, st
.
.
.
1
.
前言
在之前的文章中,实现了Electron-vue在不同系统打包成安装程序。但这只是前端build/package之后的文件打包,虽然服务端的编译之后的exe文件也可以放到一起打包,并且可以去启动服务端程序。然而不能与服务端通信的话,那么这个程序存在的意义就不大。所以在这片文章中会讲一下怎么在安装之后,启动应用程序调用服务端程序,同时获取服务端的输出值/返回值。
由于不是传统意义上的前后端通信(常见的前后端通信,只需要使用http/https进行通信即可,request发送请求,response返回请
from
subprocess
import
Popen
, PIPE,
STDOUT
p =
Popen
(cmd,
stdout
=PIPE,
stderr
=
STDOUT
, shell=True)
while True:
print(p
.
stdout
.
readline())
if not line:
break
但是由于子程序没有进行
.
.
.
subprocess
是
Python
2
.
4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码;
本文主要举例说明其中
Popen
的使用:
subprocess
.
Popen
():
在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个
.
.
.
这里当运行命令过于庞大的时候,会导致程序直接卡死在这里,我自己试试了下,确实有这个问题。
但是到底是为什么呢,前前后后想了好久,没找到答案,后来google了半天以及翻了下官方文档
终于找到了问题所在!!!划重点
如果设置了st
.
.
.
本文转载自http://www
.
firefoxbug
.
com/index
.
php/archives/2419/,如有版权问题请联系博主删除
用
subprocess
的时候,怎么获取
stdout
和
stderr
?下面是一种方式
import
subprocess
p =
subprocess
.
Popen
(['tail','-10','/tmp/hosts
.
txt'],stdin=
subprocess
.
P
.
.
.