python中的subprocess库_12Python标准库系列之subprocess模块

Python标准库系列之subprocess模块

This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes.

常用方法实例

call()

执行命令,并返回状态码,状态码0代表命令执行成功,其他的都表示命令执行不成功>>> ret = subprocess.call(["ls", "-l"], shell=False)

total 4

-rw-r--r-- 1 root root 172 May 25 21:21 file.conf

>>> ret

0

另一种执行方式# shell=True表示调用原生的shell命令去执行

>>> ret = subprocess.call("ls -l", shell=True)

total 4

-rw-r--r-- 1 root root 172 May 25 21:21 file.conf

>>> ret

0

check_call()

执行命令,如果执行状态码是0,则返回0,否则抛异常# 执行一个正确的命令就会返回执行结果和状态码

>>> subprocess.check_call(["ls", "-l"])

total 4

-rw-r--r-- 1 root root 172 May 25 21:21 file.conf

0

# 如果执行的是一个错误的命令,那么就会返回错误信息

>>> subprocess.check_call(["ls", "a"])

ls: cannot access a: No such file or directory

Traceback (most recent call last):

File "", line 1, in 

File "/usr/lib64/python2.6/subprocess.py", line 505, in check_call

raise CalledProcessError(retcode, cmd)

subprocess.CalledProcessError: Command '['ls', 'a']' returned non-zero exit status 2

check_output()

执行命令,如果状态码是0,则返回执行结果,否则抛异常# 执行成功就把执行的结果赋值给变量V

>>> V = subprocess.check_output("python -V", shell=True)

# 执行错误的命令就会输出异常

>>> subprocess.check_output("pasas", shell=True)

'pasas' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

Traceback (most recent call last):

File "", line 1, in 

File "C:\Python35\lib\subprocess.py", line 629, in check_output

**kwargs).stdout

File "C:\Python35\lib\subprocess.py", line 711, in run

output=stdout, stderr=stderr)

subprocess.CalledProcessError: Command 'pasas' returned non-zero exit status 1

以上的三种执行方式在执行命令的时候,shell默认等于True,等于True的时候,括号内的命令是一行的,如果shell等于False,那么[]内的字符串就是命令的一个元素,执行的时候会把[]内的字符串拼接起来执行。

subprocess.Popen()

call()、check_call()、check_output()默认内部调用的都是subprocess.Popen(),而subprocess.Popen()则用于执行更复杂的系统命令。

参数参数说明stdin标准输入

stdout标准输出

stderr错误句柄

cwd用于设置子进程的当前目录

env用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承

执行普通命令>>> subprocess.Popen("Python -V", shell=True)

# Python 3.5.1是输出出来的结果

>>> Python 3.5.1

执行命令分为两种:输入即可得到输出,如:ifconfig

输入进行某交互式环境,依赖再输入,如:python>>> import subprocess

# 先进入'/tmp'目录,然后在创建subprocess文件夹,shell=True可有可无

>>> subprocess.Popen("mkdir subprocess", shell=True, cwd='/tmp',)

>>> import os

>>> os.system("ls /tmp")

subprocess

subprocess.Popen()实例# 导入subprocess模块

import subprocess

# 执行python命令,进入python解释器,stdin标准输入、stdout标准输出、stderr错误输出,universal_newlines=True自动输入换行符

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

# 执行标准输入,write后面是输入的命令

obj.stdin.write("print(1)\n")

obj.stdin.write("print(2)")

# 输入之后关闭

obj.stdin.close()

# 读取标准输出的内容,赋值给cmd_out对象

cmd_out = obj.stdout.read()

# 关闭标准输出

obj.stdout.close()

# 读取错误输出的内容,赋值给cmd_error对象

cmd_error = obj.stderr.read()

# 关闭错误输出

obj.stderr.close()

# 输出内容

print(cmd_out)

print(cmd_error)

执行结果C:\Python35\python.exe F:/Python_code/sublime/Week5/Day02/sub.py

1

2

Process finished with exit code 0# 导入subprocess模块

import subprocess

# 执行python命令,进入python解释器,stdin标准输入、stdout标准输出、stderr错误输出,universal_newlines=True自动输入换行符

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

# 执行两条命令

obj.stdin.write("print(1)\n")

obj.stdin.write("print(2)")

# communicate把错误输出或者标准输出的内容赋值给out_error_list对象,如果有错误就赋值错误输出,否则就复制标准输出

out_error_list = obj.communicate()

# 输出out_error_list对象的内容

print(out_error_list)

执行结果C:\Python35\python.exe F:/Python_code/sublime/Week5/Day02/sub.py

('1\n2\n', '')

Process finished with exit code 0# 导入subprocess模块

import subprocess

# 执行python命令,进入python解释器,stdin标准输入、stdout标准输出、stderr错误输出,universal_newlines=True自动输入换行符

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

# 直接执行print("hello")命令,然后把错误或者正确的结果赋值给out_error_list对象

out_error_list = obj.communicate('print("hello")')

# 输出out_error_list对象的内容

print(out_error_list)

执行结果C:\Python35\python.exe F:/Python_code/sublime/Week5/Day02/sub.py

('hello\n', '')

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SubprocessPython标准库用于创建新进程的模块。它允许你启动一个新的进程,并与该进程进行交互,包括向其输入数据、从其输出数据等。 其,communicate()方法是Subprocess模块最常用的方法之一,它用于与子进程进行交互。当你使用Subprocess启动一个新的进程时,你可以在communicate()方法向该进程输入数据,并在该进程完成后从该进程读取输出数据。 具体来说,communicate()方法会向进程的标准输入发送数据,并等待该进程完成后读取其标准输出和标准错误输出。该方法会返回一个元组,其第一个元素表示标准输出,第二个元素表示标准错误输出。 例如,下面的代码展示了如何使用Subprocess模块来启动一个新的进程,并将数据传递给该进程: ``` import subprocess # 启动一个新的进程 process = subprocess.Popen(['python', 'my_script.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 向进程发送数据 process.stdin.write('input data'.encode()) # 等待进程完成并读取其输出数据 output, error = process.communicate() # 打印输出结果 print(output.decode()) ``` 在上面的代码,我们启动了一个新的进程,并将一个字符串作为输入数据发送给该进程。然后,我们使用communicate()方法等待该进程完成,并读取其标准输出和标准错误输出。最后,我们将输出结果打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值