我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python中的subprocess

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python中的subprocess

 python2.7 源码中的注释(由于能力有限,翻译的不太准确):

这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。这个模块计划替代一些旧代码,如:

os.system、os.spawn*、os.Popen、popen2.* 、commands.*

关于subprocess模块可以用来取代这些模块和功能在下面可以找到

这个模块定义了一个Popen的类:

  1. class Popen(args, bufsize=0, executable=None, 
  2.             stdin=None, stdout=None, stderr=None, 
  3.             preexec_fn=None, close_fds=False, shell=False, 
  4.             cwd=None, env=None, universal_newlines=False, 
  5.             startupinfo=None, creationflags=0): 

参数为:

args应该是一个字符串或序列的程序命令及参数。程序通常执行序列或字符串的第一项,但可以通过使用明确的参数进行设置。

 

 

在UNIX上,shell = False(默认):在这种情况下,Popen类使用os.execvp()来执行程序的子进程。args应该通常是一个序列。字符串将被视为只有一个字符串的序列(程序执行)。

在UNIX上,shell= True:如果参数是一个字符串,它指定了通过shell执行命令字符串。如果参数是一个序列,第一项指定命令字符串,其他的将被视为附加的shell命令的参数。
 
在Windows:Popen类通过使用CreateProcess()执行这个子进程来对字符串操作。如果参数是一个序列,它将用list2cmdline方法将其转换成一个字符串。请注意,并不是所有的MS Windows应用程序解释命令行用相同的方法:list2cmdline是专为应用程序与MS C使用相同的规则。 
 
bufsize,如果给定了,与内置行数open()的参数有相同意义:0意味着无缓冲的,1意味着线性缓冲,其他任何正值意味着使用的缓冲区(大约)大小。一个负bufsize意味着使用这个系统默认情况下,这通常意味着完全缓冲。默认值为bufsize是0(无缓冲的)。
 
stdin、stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误。有效值是PIPE,现有的文件描述符(正整数),现有文件对象,None。PIPE创建一个新的子管道。None,没有重定向;子管道将会继承父管道的文件句柄。此外,标准错误可以用STDOUT来定义,表明应用程序应该从STDOUT捕获到相同的文件句柄的标准错误数据。
 
如果preexec_fn设置为一个可调用对象,该对象将在子进程执行之前调用。
 
如果close_fds 为True,所有的文件描述符除了0、1和2都会在子进程执行之前关闭。
 
如果shell是True,将通过shell执行指定的命令。
 
如果 cwd 不为None,子进程将在执行前切换到 cwd指定的目录
 
如果 env 不为空,为新进程定义环境变量
 
如果 universal_newlines 为 True, 则文件对象标准输出、标准错误输出以文本文件形式打开, 但是在unix系统中会以\n结束,windows中以\r\n结束。 在python程序中都是看作为\n 注意: 这种功能仅仅支持用通用换行符构建的python(默认)。同时文件对象标准输出、标准输入、标准错误的换行符属性,不会被communicate()模块所更新。
 
如果给定了startupinfo and creationflags参数, 将会转交给底层CreateProcess() 函数,他们可以指定诸如主窗体的外观、新进程的优先级之类的属性(仅支持windows)
 
这个模块也定义了一些简短的函数:
call(*popenargs, **kwargs):
    运行带参数的命令.  等待命令完成后返回返回码属性。
    这些参数相对于Popen构造函数是相同的。
    Example:
    retcode = call(["ls", "-l"])
 
check_call(*popenargs, **kwargs):
    运行带参数的命令.  等待命令完成.如果退出码是0则返回,如果是其他则抛出      
    CalledProcessError错误,该CalledProcessError 对象就会有返回返回码属性
    这些参数相对于Popen构造函数是相同的。
    Example:
    check_call(["ls", "-l"])
 
check_output(*popenargs, **kwargs):
    运行带参数的命令并且以字节字符串来返回。
    如果退出码是非0则会抛出CalledProcessError。
    CalledProcessError的对象将有返回代码在returncode属性和输出在output属性
    这些参数相对于Popen构造函数是相同的。
    Example:
    output = check_output(["ls", "-l", "/dev/null"])
 
异常处理:
==============
在新程序开始执行之前子进程抛出异常,之后父进程重新抛出异常。此外,异常对象会有一个额外称为'child_traceback'的属性,从子进程的角度上看,这是一个包含错误信息的字符串。 
 
最常见的异常是OSError,比如:执行一个不存在的文件,应用程序会抛出OSError异常
 
如果Popen被无效的参数调用就会抛出‘ValueError’
 
如果check_call() and check_output()在被调用过程中返回一个非零的返回码则会抛出‘CalledProcessError’
 
安全
==============
和其他popen函数不同,它不会隐式的执行/bin/sh,这意味着所有的字符,包括shell元字符,可以安全地传递给子进程。
 
Popen 对象
=============
Popen类的实例有以下方法
poll()
    检查子进程是否终止,返回returncode属性
 
wait()
    等待子进程终止。返回returncode属性。
 
communicate(input=None)
    与进程相互作用: 发送数据到标准输入。从标准输出、标准错误读取数据, 直到到达文件尾。等待进程终止。可选的input参数应该是发送给子进程的字符串,或者如果没有要发送给子进程的数据那就用None 
    communicate() 返回一个元组 (stdout, stderr). 
    注意:读取的数据是保存在缓冲区中,因此,如果数据太大或没有限制则不要使用这个方法
 
下面的属性也是有效的:
===================== 
stdin
    如果stdin参数是PIPE,这个属性是提供输入到子进程一个文件对象,否则为None
 
stdout
    如果stdout参数是PIPE , 这个属性是提供输出到子进程一个文件对象,否则为None
 
stderr
     如果stderr参数是PIPE , 这个属性是提供错误输出到子进程一个文件对象,否则为None
 
pid
    子进程的PID
 
returncode
    子进程的返回码。空值表示进程还没有结束,一个负值‘-N’表示子进程被信号N所结束(仅unix支持)
 
用subprocess模块取代旧函数:
====================================================
在本节中, "a ==> b" 意味着 b 可以替代 a.
 
注意: 如果没有找到执行程序,所有在本节中的函数都有可能以静默状态失败;这个模块会抛出OSError异常
 
在以下的例子中, 我们假设subprocess 模块是"from subprocess import *" 这样导入的:
 
 
  1. 替代 /bin/sh shell 的引号部分 
  2. --------------------------------- 
  3. output=`mycmd myarg` 
  4. ==> 
  5. output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] 
  6.  
  7.  
  8. 替代 shell 的管道
  9. ------------------------- 
  10. output=`dmesg | grep hda` 
  11. ==> 
  12. p1 = Popen(["dmesg"], stdout=PIPE) 
  13. p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
  14. output = p2.communicate()[0] 
  15.  
  16.  
  17. 替代 os.system() 
  18. --------------------- 
  19. sts = os.system("mycmd" + " myarg") 
  20. ==> 
  21. p = Popen("mycmd" + " myarg", shell=True) 
  22. pid, sts = os.waitpid(p.pid, 0) 
  23.  
  24. 注意: 
  25.  
  26. * 通过shell调用程序通常不是必须的 
  27.  
  28. * 查看returncode attribute要比exitstatus容易些. 
  29.  
  30. 一个更现实的例子: 
  31.  
  32. try: 
  33.     retcode = call("mycmd" + " myarg", shell=True) 
  34.     if retcode < 0: 
  35.         print >>sys.stderr, "Child was terminated by signal", -retcode 
  36.     else: 
  37.         print >>sys.stderr, "Child returned", retcode 
  38. except OSError, e: 
  39.     print >>sys.stderr, "Execution failed:", e 
  40.  
  41.  
  42. 替代 os.spawn* 
  43. ------------------- 
  44. P_NOWAIT example: 
  45.  
  46. pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") 
  47. ==> 
  48. pid = Popen(["/bin/mycmd", "myarg"]).pid 
  49.  
  50.  
  51. P_WAIT example: 
  52.  
  53. retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") 
  54. ==> 
  55. retcode = call(["/bin/mycmd", "myarg"]) 
  56.  
  57.  
  58. Vector example: 
  59.  
  60. os.spawnvp(os.P_NOWAIT, path, args) 
  61. ==> 
  62. Popen([path] + args[1:]) 
  63.  
  64.  
  65. Environment example: 
  66.  
  67. os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) 
  68. ==> 
  69. Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) 
  70.  
  71.  
  72. 替代 os.popen* 
  73. ------------------- 
  74. pipe = os.popen("cmd", mode='r', bufsize) 
  75. ==> 
  76. pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout 
  77.  
  78. pipe = os.popen("cmd", mode='w', bufsize) 
  79. ==> 
  80. pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin 
  81.  
  82.  
  83. (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) 
  84. ==> 
  85. p = Popen("cmd", shell=True, bufsize=bufsize, 
  86.           stdin=PIPE, stdout=PIPE, close_fds=True) 
  87. (child_stdin, child_stdout) = (p.stdin, p.stdout) 
  88.  
  89.  
  90. (child_stdin, 
  91.  child_stdout, 
  92.  child_stderr) = os.popen3("cmd", mode, bufsize) 
  93. ==> 
  94. p = Popen("cmd", shell=True, bufsize=bufsize, 
  95.           stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) 
  96. (child_stdin, 
  97.  child_stdout, 
  98.  child_stderr) = (p.stdin, p.stdout, p.stderr) 
  99.  
  100.  
  101. (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, 
  102.                                                    bufsize) 
  103. ==> 
  104. p = Popen("cmd", shell=True, bufsize=bufsize, 
  105.           stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) 
  106. (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) 
  107.  
  108. 在 Unix系统中, os.popen2, os.popen3 与 os.popen4 同样可以在没有shell介入的情况下直接传递给程序
  109. 以序列形式执行命令行  
  110. 这种方法可以用下面的方法替换: 
  111.  
  112. (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, 
  113.                                         bufsize) 
  114. ==> 
  115. p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) 
  116. (child_stdin, child_stdout) = (p.stdin, p.stdout) 
  117.  
  118. Return code handling translates as follows: 
  119.  
  120. pipe = os.popen("cmd", 'w') 
  121. ... 
  122. rc = pipe.close() 
  123. if rc is not None and rc % 256: 
  124.     print "There were some errors" 
  125. ==> 
  126. process = Popen("cmd", 'w', shell=True, stdin=PIPE) 
  127. ... 
  128. process.stdin.close() 
  129. if process.wait() != 0: 
  130.     print "There were some errors" 
  131.  
  132.  
  133. 替代 popen2.* 
  134. ------------------ 
  135. (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) 
  136. ==> 
  137. p = Popen(["somestring"], shell=True, bufsize=bufsize 
  138.           stdin=PIPE, stdout=PIPE, close_fds=True) 
  139. (child_stdout, child_stdin) = (p.stdout, p.stdin) 
  140.  
  141. 在 Unix系统中, popen2 也可以在没有shell介入的情况下直接传递给程序以序列形式执行命令行.  
  142. 这种方法可以用下面的方法替换: 
  143.  
  144. (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, 
  145.                                             mode) 
  146. ==> 
  147. p = Popen(["mycmd", "myarg"], bufsize=bufsize, 
  148.           stdin=PIPE, stdout=PIPE, close_fds=True) 
  149. (child_stdout, child_stdin) = (p.stdout, p.stdin) 
  150.  
  151. The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, 
  152. except that: 
  153.  
  154. * subprocess.Popen raises an exception if the execution fails 
  155. * the capturestderr argument is replaced with the stderr argument. 
  156. * stdin=PIPE and stdout=PIPE must be specified. 
  157. * popen2 closes all filedescriptors by default, but you have to specify 
  158.   close_fds=True with subprocess.Popen. 
 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python中的subprocess

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中的subprocess

python2.7 源码中的注释(由于能力有限,翻译的不太准确):这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。这个模块计划替代一些旧代码,如:os.system、os.spawn*、os.Popen、popen
2023-01-31

Python中的Subprocess模块

原文出处:https://segmentfault.com/a/1190000009176351以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式.我们能从Python官方文档里读到应该用s
2023-01-31

python中使用subprocess

可以执行shell命令的相关模块和函数有:os.systemos.spawnos.popen --废弃popen --废弃commands --废弃,3.x中被移除以上执行shell命令的相关的模块和函数的功能均在
2023-01-31

python—subprocess、gl

一、subprocess模块1.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过
2023-01-31

python的subprocess模块

1 os与commands模块​2 subprocess模块​3 subprocess.Popen类我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell。​​那么我们如何通过Python来完成这些命
2023-01-31

python中subprocess怎么使用

在Python中,使用`subprocess`模块可以调用系统命令并与其交互。下面是一些常见的使用方法:1. 执行命令并获取输出:```pythonimport subprocessoutput = subprocess.check_out
2023-08-18

python模块--subprocess

subprocess模块                                                                                                            
2023-01-31

python subprocess模块

subprocess模块允许你生成一个或多个进程,并且可以跟它交互,并且获取返回的结果,这个模块想要替换掉几个老的方法: os.system os.spawn* 所以以后跟系统交互的命令,尽量用su
2023-01-31

Python之Subprocess模块

前言其实有一个模块也支持执行系统命令,那个模块就是sys.system,但他执行系统命令会直接通过主进程去执行命令,那假如,该命令的执行需要耗费一个小时,那么主进程会卡一个小时,而不会去干别的事,这样就会导致程序的运行效率低下。如果由sub
2023-01-31

python 获取subprocess实

import subprocessp = subprocess.Popen("ping www.baidu.com -n 6",shell=True,stdout=subprocess.PIPE)#一下面是第一种方法(使用时请先注释第二种方
2023-01-31

python模块之subprocess

subprocess.run()运行并等待args参数指定的指令完成,返回CompletedProcess实例。参数:(*popenargs, input=None, capture_output=False, timeout=None,
2023-01-31

python subprocess的用法是什么

subprocess 是 Python 内置的库,用于创建和管理新的子进程。它提供了一种在 Python 程序中调用外部命令和程序的方法。subprocess 模块的主要用法有以下几种:1. 运行外部命令或程序:使用 subprocess.
2023-10-20

python中subprocess批量执行linux命令

可以执行shell命令的相关模块和函数有:os.systemos.spawnos.popen --废弃popen --废弃commands --废弃,3.x中被移除以上执行shell命令的相关的模块和函数的功能均在 subprocess 模
2022-06-04

一文搞懂Python中subprocess模块的使用

subprocess是子流程,即进程的意思,该模块可以启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。本文将和大家聊聊subprocess模块的使用,需要的可以参考一下
2022-11-21

python运行shell命令subprocess的实现

本文主要介绍了python运行shell命令subprocess的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

Python实现系统交互(subprocess)

目录一、os与commands模块1. os.system()函数实例2. os.popen()函数实例3. commands.getstatusoutput()函数实例二、subprocess模块1. subprocess模块中的常用函数
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录