subprocess.Popen()
class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
实际上,上面的几个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。
与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block),举例:
>>> import subprocess
>>> child = subprocess.Popen(['ping','-c','4','blog.linuxeye.com'])
>>> print 'parent process'
从运行结果中看到,父进程在开启子进程之后并等待child的完成后,再运行print。
此外,你还可以在父进程中对子进程进行其它操作,比如我们上面例子中的child对象:
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
子进程的PID存储在child.pid
二、子进程的文本流控制
子进程的标准输入、标准输出和标准错误如下属性分别表示:
child.stdin
child.stdout
child.stderr
可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe),如下2个例子:
>>> import subprocess
>>> child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
>>> print child1.stdout.read(),
#或者child1.communicate()
>>> import subprocess
>>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
>>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
>>> out = child2.communicate()
subprocess.PIPE实际上为文本流提供一个缓存区。child1的stdout将文本输出到缓存区,随后child2的stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。
注意:communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成
相关推荐
python 打印信息重定向 GUI界面 ,PyQt5实时显示调用外部程序的实时输出显示,subprocess.Popen stdout输出重定向,备注详细!
subprocess模块是Python用来替代旧的os.system, popen2和commands模块的,它允许你从Python程序中启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。今天我们要详细解析的是subprocess模块中的...
特别是subprocess.Popen()类,它是一个非常强大且灵活的创建新进程的接口。自Python 2.4版本以来,subprocess模块替代了多个旧的模块和函数,例如os.system, os.spawn*, os.popen*, popen2.*和commands.*,它允许更...
res = subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 这样打包后出来的程序就不会出现命令框,而且也能够正常运行了。 以上这篇python隐藏终端执行cmd...
在IT行业中,`subprocess.Popen` 是Python标准库中的一个模块,用于在子进程中执行命令行程序,并可以与这些进程进行交互。这个功能强大的工具在系统集成、自动化脚本以及测试环境中非常常见。当我们需要创建日志...
process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE) output, error = process.communicate() ``` 4. **subprocess.call()** `subprocess.call()` 与 `os.system()` 类似,但提供了更多灵活性...
- **解析**:`subprocess.Popen`用于启动一个新的进程,并返回一个`Popen`对象。`shell=True`表示通过shell来执行命令,而`&&`则是用来连接两个命令,确保前一条命令成功后才会执行下一条命令。 - **注意**:`shell=...
4. `subprocess.Popen()`:这是`subprocess`模块的核心类,用于创建子进程。`Popen`对象允许更精细的控制,如自定义输入/输出/错误流,设置环境变量等。它不自动等待子进程结束,需要调用`wait()`方法来阻塞父进程,...
popen包在 python 中提供了一个简单的类似 shell 的语法来运行外部命令。 特征: 链接(又名管道)为Sh('ls') | 'sort' Sh('ls') | 'sort' 将标准错误重定向到标准输出作为Sh('make').include_stderr | 'wc' Sh...
p = subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) # 其他操作... kill_subprocess_and_children(p) if __name__ == "__main__": main() ``` #### 处理僵尸进程 在使用`...
c_line = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] if c_line.find("List of devices attached") return None return c_line.split("\t")[0]....
这里记录一下popen()接受命令返回值及处理,我想要的值是docker的ID $ docker ps -q 2d3586a30e7e 03f1ca1331c7 但是使用python调用的时候没法直接得到这个结果,所以想要获取这个数据 #导入os这个模块 In [8]:...
subprocess.Popen用来创建子进程。 1)Popen启动新的进程与父进程并行执行,默认父进程不等待新进程结束。 复制代码 代码如下: def TestPopen(): import subprocess p=subprocess.Popen(“dir”,shell=True) ...
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 获取子进程的输出 stdout, stderr = p.communicate() # 处理输出 print("标准输出:", stdout.decode()) print("标准错误:", ...
* test11.py ...p = subprocess.Popen(“python test11.py”, shell=True, stdout=subprocess.PIPE) # None表示正在执行中 while p.poll() is None: out = p.stdout.readline() if out !
在处理打开文件的问题时,`os.startfile()`函数和`subprocess.Popen()`方法是常用的选择。 1. `os.startfile()`: 这个函数是`os`模块的一部分,它用于启动指定的文件,并使用关联的应用程序打开它。例如,如果你想...