python中的subprocess_python函数与方法的详细

python中的subprocess_python函数与方法的详细python3的subprocess的各个方法的区别(-)

大家好,又见面了,我是你们的朋友全栈君。

subprocess(python3.7)

subprocess 主要是为了替换一下的模块函数,允许你执行一些命令,并获取返回的状态码和 输入,输出和错误信息。

os.system
os.spawn*

 

subprocess 有好多方法,本文主要在总结下之间的区别是什么,最后官方推荐使用哪个。

subprocess的主要方法:

subprocess.run(),subprocess.Popen(),subprocess.call   #这些模块都是基于Popen的

Python 3.5 之前

subprocess.call   //call 系列 都是等待命令执行完, Wait for command to complete

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

只返回执行结果的code 等同于subprocess.run(args).returncode

Note Do not use stdout=PIPE or stderr=PIPE with this function. The child process will block if it generates enough output to a pipe to fill up the OS pipe buffer as the pipes are not being read from.

############例子###
ret=subprocess.call(['ls', '-l'])     # ret 程序执行结果返回值,正确执行都是0


----------------------------捕获输出结果到一个文件里Redirecting STDOUT to a File---

with open('joe.txt', 'w') as f:   # 执行后joe.txt 文件内容为 Wed May 15 17:07:59 CST 2019
  subprocess.call(['date'], stdout=f)
   


-------捕获输出结果到字符串,Redirecting STDOUT to strings---

ret=subprocess.check_output()       #ret 为output内容(命令输出的内容) 等同于run(..., check=True, stdout=PIPE).stdout


-------------------
subprocess.check_call()   #和 subprocess.call 一样,只是返回值不是0就引起异常,raise CalledProcessError ,等同于 subprocess.run(…, check=True)



-----输入stdin ----------

with open('joe.txt', 'r') as fr
  subprocess.call(['cat'], stdin=f)
   
-------


######################################################
subprocess.Popen()   #最基本的subprocess模块

class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

p = subprocess.Popen(['ls', '-l']) #返回的p是Popen 对象
p(Popen对象) 有一下方法
p.poll() 检查子进程(cmd) 是否结束 ,如果没有结束会返回None,结束就返回return returncode
p.returncode 程序之后后的返回码,一般正常结束会返回0,否则会返回其他值
p.wait() 等待子进程结束,然后返回returncode值

If the process does not terminate after timeout seconds, raise a TimeoutExpired exception. It is safe to catch this exception and retry the wait.

Note This will deadlock when using stdout=PIPE or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use Popen.communicate() when using pipes to avoid that.
Note The function is implemented using a busy loop (non-blocking call and short sleeps). Use the asyncio module for an asynchronous wait: see asyncio.create_subprocess_exec.


p.communicate() 和子进程交互,返回一个元祖,returns a tuple (stdout_data, stderr_data)
​p.terminate() 终止子进程,相当于发送SIGTERM 信号,相当于kill (后面不加参数)
p.kill() 终止子进程,相当于发送SIGKILL 信号,相当于kill -9
p.stdin,p.stdout,p.stderr 分别是输入,输出,错误输出,在python3中都是byte类型需要decode转化
p.returncode() 程序的返回状态 ,程序没有结束的话会返回None
p.pid 返回程序的 pid
p.send_signal(signal) 发送一个信号给子进程
subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

Popen 参数:
------
args, a sequence of program arguments or else a single string(参数是一个序列如,列表,元祖等。或者参数是一个字符串),默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是一个字符串,需要设置shell=True,即开启一个shell 执行一个字符串的命令,或者序列的第一项
-----
bufsize 参数,stdin,stdout,stderr的缓存参数
executable 参数
@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,shell=True时 executable=, 用于替换系统默认的shell(一般是bash),
p = subprocess.Popen('echo $0',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,executable='/bin/zsh') out,_=p.communicate() print(out.decode())
输出>>>/bin/zsh
@@@@@@@@@@@@@@@@@@@@@@@@@ shell=False时 executable=xxx,xxx会替换序列的第一项,一下'ls' 替换了'cat' 最终执行了 ls 'a.py','a.txt','b.txt'
p = subprocess.Popen(['cat','a.py','a.txt','b.txt'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,executable='ls') out,_=p.communicate() print(out.decode())
输出>>>a.py a.txt b.txt

 —–

stdin=None, stdout=None, stderr=None 和输入,输出,错误输出有关,

想要捕捉这些信息可以设置为 将值设置为subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE 如果想要达到2>&1 可以设置为stdout=subprocess.PIPE,stderr=subprocess.STDOUT 这些内容 stdin 如输入(“haha”) 可以通过p.stdin.write(b”hahha”);p.stdin.close() 或者 out,_=p.communicate(b’haha’) stdout,stderr 可以通过p.stdout.readline(),p.stderr.readline() [就是文件描述符的一些参数如read(),readline等]

 

——

 

close_fds=True 子进程是否继承文件描述符,如果false 将关闭除了0,1,2之外的所有文件描述符。 print( p.stdin.fileno()) #查看自身对应的(stdin/stdout)的文件描述符 参考一下遇到的问题close_fds(python2.x遇到的问题???!!!) https://stackoverflow.com/questions/19950185/python-close-fds-not-clear http://drmingdrmer.github.io/tech/programming/2017/11/20/python-concurrent-popen.html

——-

shell=True 是否在shell中执行,参考args 说明

——–

cwd 当前的工作目录,如果有值,就会进入cd 到这个目录执行args命令

—-

text=True,和universal_newlines=True一样,universal_newlines只是为了向后兼容 都是让stdxxx以文本模式输出,而不是默认的二进制模式

If encoding or errors are specified, or text is true, the file objects stdin, stdout and stderr are opened in text mode with the specified encoding and errors, as described above in Frequently Used Arguments. The universal_newlines argument is equivalent to text and is provided for backwards compatibility. By default, file objects are opened in binary mode.

—–

 

python3.5 以后官方推荐使用run

p=subprocess.run(args, ***, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

 run 也是需要等进程结束后才返回结果,所以没有结束p.stdout等就不会输出结果

 

run的参数,和Popen 一样

capture_output =true 相当于stdout=PIPE and stderr=PIPE

timeout 设置子进程超时时间,超时引起 TimeoutExpired异常

The timeout argument is passed to Popen.communicate(). If the timeout expires, the child process will be killed and waited for. The TimeoutExpired exception will be re-raised after the child process has terminated

 

input=xxx 相当于 Popen.communicate(xxx)和自动创建 stdin=PIPE

The input argument is passed to Popen.communicate() and thus to the subprocess’s stdin. If used it must be a byte sequence, or a string if encoding or errors is specified or text is true. When used, the internal Popen object is automatically created with stdin=PIPE, and the stdin argument may not be used as well.

check check=True 如果程序返回状态码不是0 就引起异常CalledProcessError

If check is true, and the process exits with a non-zero exit code, a CalledProcessErrorexception will be raised. Attributes of that exception hold the arguments, the exit code, and stdout and stderr if they were captured.

p=subprocess.run(), 执行run后会返回 CompletedProcess类型 实例 P

实例P 有如下方法

p.args

p.returncode

p.stdout

p.stderr

p.check_returncode

 

python中的subprocess_python函数与方法的详细

 

 

 

 

转载于:https://www.cnblogs.com/lijinlei521/p/10873601.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106820.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月22日 上午8:20
下一篇 2022年4月22日 上午8:20


相关推荐

  • 顺序图(Sequence Diagram)

    顺序图(Sequence Diagram)交互图用来描述系统中的对象是如何进行相互作用的 即一组对象是如何进行消息传递的 交互主要用于描述协作的动态行为方面 当对交互建模时 通常既包括对象 每个对象都扮演某一特定的角色 又包括消息 每个消息都代表对象之间的通信活动 并导致一定的动作发生

    2026年3月16日
    2
  • 微信公众号开发者账号_小程序后端开发教程

    微信公众号开发者账号_小程序后端开发教程编辑模式与开发模式微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在“高级功能”里进行配置,点击“高级功能”,将看到如下界面:从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启。那两种模式有什么区别呢?作为开发人员到底要开启哪一种呢?编辑模式:主要针对非编程人员及信息发布类公众帐号使用。开启该模式后,可以方便地通

    2026年4月19日
    5
  • Teradata SQL基础

    Teradata SQL基础HELP 帮助用户了解数据库中各种对象的结构 SHOW 帮助用户了解某种对象的定义 即返回其 DDL 语句 EXPLAIN 返回一个 SQL 语句经优化处理后的执行步骤 FALLBACK 对数据加以保护的一种方式 是冗余的备份 RENAME 对表重命名 NULLIFZERO 对数据作累计处理时 忽略零值 ZEROIFNULL 对数据作累计处理时 将空值作零处理 WITH BY 对详细数据

    2026年3月17日
    1
  • pipeline流水线框架_流水线主动轮设计

    pipeline流水线框架_流水线主动轮设计流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。缺点:功耗增加,面积增加,硬件复杂度增加,特别对于复杂逻辑如cpu的流水线而言,流水越深,发生需要hold流水线或reset流水线的情况时,时间损失越大。…

    2022年8月14日
    10
  • 世界十大量化交易模型_如何防止量化模型被窃取

    世界十大量化交易模型_如何防止量化模型被窃取01、股票多空策略股票多空策略(EquityLong/Short),即买一些股票,通过融券的方式去卖空一些股票,然后再用一些股指期货进行对冲。这是国际上主流的HedgeFund所用的量化策略,据知名数据商Eurekahedge的统计数据,在国际对冲基金中长期占比第一(一直超过30%)。比如2011年获得美国量化基金业评比第一名的贝莱德“32Cap全球对冲基金产品”使用的就是经典的多空策略…

    2022年4月19日
    119
  • 百度之星资格赛——Disk Schedule(双调旅行商问题)

    百度之星资格赛——Disk Schedule(双调旅行商问题)

    2022年2月3日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号