Python subprocess

一、subprocess

作用:用于和系统之间进行交互

常用subprocess方法实例

import subprocess
# 向linux提交执行命令.并返回结果
subprocess.run(["df","-h"])
subprocess.run("df -h",shell=True)

# 打印并进行过滤. ps:此处的shell=True意思是:不需让python进行解析.把命令按字符串形式传递给linux. 让linux自己去解析.

# 涉及到|管道这用这种方法. 不涉及到管道|那么用上边的方法.列表即可. 也可以字符串的方式. 不过需要加shell=True.字符串形式必须加shell=True

subprocess.run("df -h|grep sda1",shell=True)

# 向linux提交执行命令.并返回结果. 0 or 非0[抛出异常]

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

# 接收字符串格式命令.返回元组形式.第1个元素是执行状态.第2个是命令结果

subprocess.getstatusoutput('ls /bin/ls')
>>>(0, '/bin/ls')

# 接收字符串格式命令.并返回结果

subprocess.getoutput('ls /bin/ls')
>>>'/bin/ls'

# 执行命令.返回结果.注意是返回结果. 格式是二进制格式

subprocess.check_output("pwd",shell=True)
>>>b'/root\n'

#上面那些方法,底层都是封装的subprocess.Popen

poll()
Check if child process has terminated. Returns returncode
wait()

Wait for child process to terminate. Returns returncode attribute.

terminate() 杀掉所启动进程

communicate() 等待任务结束

stdin 标准输入

stdout 标准输出

stderr 标准错误

"""

此处的stdin表示标准输入. stdout表示标准输出. stderr表示标准错误输出 shell=True的意思上边已经解释了.

读取方法:

p.stdout.read() 读取输出命令

p.stderr.read() 读取标准错误输出命令

"""
p = subprocess.Popen("ifconfig|grep 192",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
# 检测命令是否执行完. 返回None表示未执行完. 返会0或者报错.说明执行完毕
print(p.poll())
# 等待执行结果返回的状态
print(p.wait())
# 终止任务
print(p.terminate())
p.stdout.read()
>>>b' inet addr:192.168.12.120 Bcast:192.168.12.255 Mask:255.255.255.0\n'

subprocess.Popen讲解

可用参数:

args: shell命令.可以是字符串或者序列类型(如:list,元组)

bufsize: 指定缓冲.0 无缓冲.1 行缓冲.其他缓冲区大小.负值系统缓冲

preexec_fn: 只在Unix平台下有效.用于指定一个可执行对象(callable object).它将在子进程运行之前被调用

close_sfs: 在windows平台下.如果close_fds被设置为True.则新创建的子进程将不会继承父进程的输入\输出\错误管道.

shell: 同上

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

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

stdin, stdout, stderr: 分别表示程序的标准输入\输出\错误句柄

所以不能将close_fds设置为True同时重定向子进程的标准输入\输出与错误(stdin, stdout, stderr).

universal_newlines: 不同系统的换行符不同,True -> 同意使用 \n

startupinfo与createionflags只在windows下有效

将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

终端输入的命令分为两种:

输入即可得到输出,如:ifconfig

输入进行某环境,依赖再输入,如:python

p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(p.stdout.read())

subprocess实现sudo 自动输入密码脚本

import subprocess
def user_password():
user_password = '123456'
return user_password
echo = subprocess.Popen(['echo',user_password()],
stdout=subprocess.PIPE,
)
sudo = subprocess.Popen(['sudo','-S','iptables','-L'],
stdin=echo.stdout,
stdout=subprocess.PIPE,
)
end_of_pipe = sudo.stdout
print "Password ok \n Iptables Chains %s" % end_of_pipe.read()