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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gridbaglayout布局_gridsearch

    gridbaglayout布局_gridsearch自己想做个小程序,却在布局上犯了难,使用FlowLayout和BorderLayout这些功能不够强大,使用GridBagLayout却不会,只好求助于文档了。文档对这个布局管理器介绍很详细,但是最痛苦的是英文。不过幸好它有实例,经过在网上查阅和推敲实例,终于对GridBagLayout的使用有了一个成型的了解,拿出来与大家分享。GridBagLayout是一个灵活的布局管理器,部件如果想

    2022年9月9日
    0
  • 线程的用户态和内核态_缺页发生在用户态还是内核态

    线程的用户态和内核态_缺页发生在用户态还是内核态(1)用户态和内核态的概念?—>内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序—>用户态:只能受限的访问内存,且不允许访问外围设备.占用CPU的能力被剥夺,CPU资源可以被其他程序获取(2)为什么需要用户态和内核态?—>由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,…

    2022年9月18日
    0
  • 什么是WinHTTP?「建议收藏」

    什么是WinHTTP?「建议收藏」WinHTTP的全称是MicrosoftWindowsHTTPServices,它提供给开发者一个HTTP客户端应用程序接口(API),通过这种API借助HTTP协议给其他的HTTP服务器发

    2022年7月4日
    56
  • webstorm插件集合[通俗易懂]

    webstorm插件集合[通俗易懂]webstorm插件集合

    2022年9月9日
    0
  • vsftp日志查看_vsftp日志配置

    vsftp日志查看_vsftp日志配置1、开始vsftp记录日志。修改/etc/vsftpd/vsftpd.conf如下:xferlog_enable=YESxferlog_std_format=YESxferlog_file=/var/log/xferlogFTP服务器的日志设置,可以通过修改主配置文件/etc/vsftpd.conf实现。主配置文件中与日志设置有关的选项包括xferlog_enable、xferlog_file…

    2025年6月13日
    3
  • xiao776php,《xiao 776》_xiao 776_NEWS下载网「建议收藏」

    xiao776php,《xiao 776》_xiao 776_NEWS下载网「建议收藏」康平候爷一五一十述说了一遍,因是夏钰之伤在腿上,这段时日无法下榻,他自己已然焦躁得不行。xiao776因此,趋向正常性(normality)的倾向是一种格局的倾向,而格局里面的自我和物体则受制于格局以及格局与其内容的不变联结,这里的内容意指物体和自我。面对阻在他身前的最后一队死士,他疯了一般,浑身爆发出森然的杀意,弯刀过处全是一片飞扬的血肉,守卫渐渐抵挡不住,废宫越来越在眼前。提示:xiao7…

    2022年10月7日
    0

发表回复

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

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