(重)python:subprocess模块之Popen方法简介,管道机制(stdout\stdin\stderr)实现shell命令执行

subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码;

本文主要举例说明其中Popen的使用:

subprocess.Popen():

在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数:

args:shell命令,可以是字符串,或者序列类型,如list,tuple。

bufsize:缓冲区大小,可不用关心

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

shell:与上面方法中用法相同

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

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

universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

例子:使用tcp协议下套接字编程实现shell命令执行;

服务端:

from socket import *
import subprocess#subprocess是Python 2.4中新增的一个模块,
# 它允许你生成新的进程,连接到它们的 input/output/error 管道,
# 并获取它们的返回(状态)码

ip_port=("127.0.0.1",8080)
back_log=5
buffer_size=1024*2

tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)

while True:
    conn,addr=tcp_server.accept()
    while True:
        try:
            cmd=conn.recv(buffer_size)
            if not cmd:break
            print("服务器收到的命令:",cmd.decode("utf-8"))
            #执行命令,得到命令结果cmd_res
            res=subprocess.Popen(cmd.decode("utf-8"),shell=True,
                                 stdout=subprocess.PIPE,
                                 stdin=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            #subprocess.Popen:subprocess模块下的Popen方法,实现:
            # 在执行该程序的服务器上实现shell命令的执行;
            #subprocess.PIPE--->管道机制:一个程序与另一个程序实现通信,
            # 例如:cmd命令提示符与屏幕显示,又如:subprocess 与屏幕显示
            #subprocess.POPE,有stdout:标准输出内容扔到管道;
            # stdin:标准输入内容扔到管道;
            # stderr:标准错误输出内容扔到管道;
            #通过read将管道里面的内容一部分一部分的获取读出;
            #管道里面的内容,只可读一次,即:丢进管道的内容读一部分少一部分,直到读完;
            #stdout\stdin\stderr的内容扔进不同管道,read不冲突;例如:
            #如果一个命令执行出错,那么,stderr扔进管道就有内容,stdout就read空;
            #所以,这个就可以判断一个命令是否执行有错;
            err=res.stderr.read()
            # res是一个对象,需要读取res对象的stderr\strout\stdin的属性,才可获取值
            #如果:err有值,即表示命令执行报错,即:stdout就为空
            if err:
                cmd_res=err
            else:
                cmd_res=res.stdout.read()
            conn.send(cmd_res)#注意:cmd_res利用的是系统默认编码:gbk
        except Exception:
            break
        conn.close()



客户端:

from socket import *

tcp_socket_client=socket(AF_INET,SOCK_STREAM)

ip_port=('127.0.0.1',8080)
buffer_size=1024*2

tcp_socket_client.connect(ip_port)

while True:
    cmd=input(">>>:请输入命令:").strip()
    if not cmd :continue
    if cmd=="quit":break
    tcp_socket_client.send(cmd.encode("utf-8"))
    cmd_res=tcp_socket_client.recv(buffer_size)
    if not cmd_res:#cmd_res,执行成功了,但是没有返回值的情况
        print("执行成功!",cmd_res.decode("gbk"))
    else:
        print(cmd_res.decode("gbk"))#系统默认编码:gbk

猜你喜欢

转载自blog.csdn.net/ak739105231/article/details/86742031