Python Basic - subprocess模块,让python在主机上执行相应的shell命令

简介

subprocess 是一个允许python在主机上运行一个子进程,该子进程可以去与该计算机通过 == “输入” “输出”“错误输出”“管道” ==等与计算机进行交互,并将此子进程获取的命令执行的返回值返回给主进程。总结一句话就是,子进去去执行命令,然后将结果返回给主进程进行进一步的处理。

主要的方法

run()方法

运行带参数的命令,返回一个完整的进程实例。

def run(*popenargs,
        input=None, capture_output=False, timeout=None, check=False, **kwargs)
  1. 返回的实例可能会一些属性参数,返回码,标准输出或者标准错误输出。默认情况下,标准输出与标准错误输出是不抓获的
  2. 这两个的属性可以是None,stdout=PIPE stderr=PIPE 这样可以去抓取这些信息。
  3. 如果退出状态码不为0,将会抛出一个异常“ CalledProcessError”,这个对象会返回一个状态码,输出和错误输出会捕获到他。
  4. 如果“timeout”时间给定了,进程的处理时间超时了后,会抛出一个异常“TimeoutExpired”
  5. 一个可选参数“input”允许输入“bytes”或者"string"到这个子进程的“标准输入”,如果使用了这个选项,将不能使用Popen的“stdin”的选项。
  6. 缺省情况下,所有的通信是使用的“bytes”,所以“input”会是bytes,标准输出与标准错误输出也会是"bytes",如果在text模式中,“input”会是字符串型,标准输出与标准错误输出会是string类型,会按照当前的编码设置进行解码。
  7. 其它的参数与Popen一样

示例一:

import subprocess
subprocess.run("dir",shell=True)

"""
Volume in drive E is New Volume
 Volume Serial Number is 0055-ECC4

 Directory of E:\Python\Pycharm\Lab\week11

09/25/2020  05:09 PM    <DIR>          .
09/25/2020  05:09 PM    <DIR>          ..
09/25/2020  11:28 AM               364 socketclient.py
09/25/2020  03:00 PM             1,554 sockettest.py
09/25/2020  05:09 PM                51 testsubprocesses.py
09/23/2020  05:40 PM    <DIR>          __pycache__
               3 File(s)          1,969 bytes
               3 Dir(s)  46,847,115,264 bytes free

"""

Popen接口(subprocess的核心)

class Popen(object):

Popen的介绍

方法名用途
args一个字符串, 或者程序运行需要的参数队列.
bufsize当创建 stdin/stdout/stderr(标准输入/标准输出/标准错误输出) pipe(管道) file 对象时,为 open() 函数 需要使用到的参数的缓存
executable一个可替代的可执行的程序
stdin, stdout and stderr(标准输入/标准输出/标准错误输出)这些分别指定可执行程序的’ 标准输入, 标准输出 和 标准错误输出的处理者.
preexec_fn:(仅POSIX) 在子进程中被调用的对象,仅在子进程被执行之前
close_fds:控制关闭或者继承相应的文件描述符.
shell:如果为“true”,命令将会使用shell进行执行.
cwd:在子进程被执行之前,设置当前的工作目录.
env:为新的进程设置相应的环境变量.
text:如果为“true”, 如果给定了,则使用给定的解码方式解码标准输入,标准输出,标准错误输出。如果没有给定,则使用系统默认的解码方式。
universal_newlines:文本的别名, 提供可加删的能力.
encoding and errors:Text mode encoding and error handling to use for file objects stdin, stdout and stderr.

示例一:创建一个子进程,然后执行一个简单的命令

示例
import subprocess

while True:
    cmd = input("input command you want to execute:")
    if cmd == "exit":
        break
    subprocess.Popen("cmd", shell=True)

运行并结果输出
input command you want to execute:dir
input command you want to execute:Microsoft Windows [Version 10.0.18362.836]
(c) 2019 Microsoft Corporation. All rights reserved.

E:\Nextcloud\NAS\Study\Study-Note\Python\Pycharm\Lab\week11>

Popen的子方法

方法名用途
poll()检查进程是否终止,如果终止返回 returncode,否则返回 None。
wait(timeout)等待子进程终止。
communicate(input,timeout)和子进程交互,发送和读取数据。
send_signal(singnal)发送信号到子进程 。
terminate()停止子进程,也就是发送SIGTERM信号到子进程。
kill()杀死子进程。发送 SIGKILL 信号到子进程。

subprocess.PIPE

默认情况下,输出结果会直接展示到屏幕上来(标准输出),但是这个结果是通过一个子进程的方式进行运行的,所以我们需要将这个子进程运行的消息提到主进程进进行展示,所以将期封装进入到对象中,通过特定的方法进行调用。通过stdout进行调用方法。

import subprocess
result = subprocess.run("dir",shell=True,stdout=subprocess.PIPE)
print(result)



"""
CompletedProcess(args='dir', returncode=0, stdout=b' Volume in drive E is New Volume\r\n Volume Serial Number is 0055-ECC4\r\n\r\n Directory of E:\\Nextcloud\\NAS\\Study\\Study-Note\\Python\\Pycharm\\Lab\\week11\r\n\r\n09/25/2020  05:13 PM    <DIR>          .\r\n09/25/2020  05:13 PM    <DIR>          ..\r\n09/25/2020  11:28 AM               364 socketclient.py\r\n09/25/2020  03:00 PM             1,554 sockettest.py\r\n09/25/2020  05:13 PM               106 testsubprocesses.py\r\n09/23/2020  05:40 PM    <DIR>          __pycache__\r\n               3 File(s)          2,024 bytes\r\n               3 Dir(s)  46,847,115,264 bytes free\r\n')

"""

但是输出为一个bytes类型的,所以需要转换成str

import subprocess
result = subprocess.run("dir",shell=True,stdout=subprocess.PIPE)
print(str(result.stdout,"utf8"))




"""
 Volume in drive E is New Volume
 Volume Serial Number is 0055-ECC4

 Directory of E:\Nextcloud\NAS\Study\Study-Note\Python\Pycharm\Lab\week11

09/25/2020  05:19 PM    <DIR>          .
09/25/2020  05:19 PM    <DIR>          ..
09/25/2020  11:28 AM               364 socketclient.py
09/25/2020  03:00 PM             1,554 sockettest.py
09/25/2020  05:19 PM               782 testsubprocesses.py
09/23/2020  05:40 PM    <DIR>          __pycache__
               3 File(s)          2,700 bytes
               3 Dir(s)  46,847,111,168 bytes free


Process finished with exit code 0
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值