python如何调用shell(Python调用Shell的常见操作和实时输出)
# 第一种,使用os.system方法,这种方法无法获取输出结果
import osos.system('ls')
# 第二种,使用os.popen方法,这种方法可以获取输出
import osstream = os.popen('echo 12345') #popen也有不同版本output = stream.read()print(output) #输出12345
# 第三种,使用subprocess模块
class subprocess.Popen(args,bufsize=-1,shell=False,stdin=None,stdout=None,stderr=None)'''args:对应的shell命令bufsize:缓冲区大小,0表示不使用缓冲区shell:若该参数为True,将使用操作系统的shell执行命令stdin,stdout,stderr分别表示程序的标准输入,输出,错误句柄-poll():检查进程是否终止,终止则返回returncode,否则None-wait(timeout):等待子进程终止-communicate(timeout):和子进程交互-terminate():停止子进程==send_signal(SIGTERM)-kill():杀死子进程'''# 下面是范例# 获取实时输出import subprocessimport shlexdef real_run_command(command):process =subprocess.Popen(shlex.split(command),stdout = subprocess.PIPE) #同时使用了subprocess.PIPE 作为参数,这个是一个特殊值,用于表明这些通道要开放while True:output = process.stdout.readline()if output == b"" and process.poll() is not None: # 因为输出的字节流,所以要用b''或者bytes.decode(str,errors='ignore')breakif output:print(output.strip())rc = process.poll()return rc#调用rc = real_run_command(sh test.sh)print("return code=%s"%rc)
第四种:ssh实时输出
#SSH
Python 执行远程主机可以使用 paramiko 框架,但 paramiko 框架的 exec_command 方法, 默认是没有开启 bufsize 的, 也就是说必须等到一个命令执行完, 我们才可以打印到命令的输出信息, 但为了体验更接近在终端执行的感觉, 实时输出就很有必要了。我这里的需求是 websockets 实时输出远程命令的日志信息,所以我只需要定义 command 和下面的 callback 函数就可以了。
Paramiko 的 exec_command 方法提供了 bufsize 参数, 我们可以调小缓冲区, 然后使程序更快的打满缓冲区生成缓冲块的方式, 来实现实时输出。我们对SSHClient 简单封装一下, 增加一个 run 的方法。
Python
from itertools import izip_longestfrom paramiko import SSHClientfrom paramiko import AutoAddPolicyclass MySSHClient(SSHClient): def run(self, command, callback): stdin, stdout, stderr = self.exec_command( command, bufsize=1 ) stdout_iter = iter(stdout.readline, '') stderr_iter = iter(stderr.readline, '') for out, err in izip_longest(stdout_iter, stderr_iter): if out: callback(out.strip()) if err: callback(err.strip()) return stdin, stdout, stderr
使用方式和原生的 SSHClient 一样, 只不过不去调用 exec_command 方法了, 改为调用 run 方法.
Python
def console(text): print(text)ssh = MySSHClient()ssh.set_missing_host_key_policy(AutoAddPolicy())ssh.connect("IPADDRESS", 22, "USER", "PASSWORD")stdin, stdout, stderr = ssh.run("python -u test.py", console)print stderr.channel.recv_exit_status()
系统下载排行榜71011xp
番茄花园Win7 64位推荐旗舰版 V2021.05
2深度技术Win7 64位豪华旗舰版 V2021.07
3番茄花园Win7 64位旗舰激活版 V2021.07
4带USB3.0驱动Win7镜像 V2021
5系统之家 Ghost Win7 64位 旗舰激活版 V2021.11
6萝卜家园Win7 64位旗舰纯净版 V2021.08
7技术员联盟Win7 64位旗舰激活版 V2021.09
8雨林木风Win7 SP1 64位旗舰版 V2021.05
9萝卜家园Ghost Win7 64位极速装机版 V2021.04
10技术员联盟Win7 64位完美装机版 V2021.04
深度技术Win10 64位优化专业版 V2021.06
2深度技术Win10系统 最新精简版 V2021.09
3Win10超级精简版 V2021
4Win10完整版原版镜像 V2021
5风林火山Win10 21H1 64位专业版 V2021.06
6Win10光盘镜像文件 V2021
7深度技术 Ghost Win10 64位 专业稳定版 V2021.11
8技术员联盟Ghost Win10 64位正式版 V2021.10
9Win10 21H1 Build 19043.1320 官方正式版
10技术员联盟Win10 64位永久激活版镜像 V2021.07
系统之家 Ghost Win11 64位 官方正式版 V2021.11
2Win11PE网络纯净版 V2021
3系统之家Ghost Win11 64位专业版 V2021.10
4Win11官网纯净版 V2021.10
5Win11 RTM版镜像 V2021
6番茄花园Win11系统64位 V2021.09 极速专业版
7Win11专业版原版镜像ISO V2021
8Win11官方中文正式版 V2021
9Win11 22494.1000预览版 V2021.11
10番茄花园Win11 64位极速优化版 V2021.08
深度技术Windows XP SP3 稳定专业版 V2021.08
2雨林木风Ghost XP Sp3纯净版 V2021.08
3萝卜家园WindowsXP Sp3专业版 V2021.06
4雨林木风WindowsXP Sp3专业版 V2021.06
5技术员联盟Windows XP SP3极速专业版 V2021.07
6风林火山Ghost XP Sp3纯净版 V2021.08
7萝卜家园 Windows Sp3 XP 经典版 V2021.04
8番茄花园WindowsXP Sp3专业版 V2021.05
9电脑公司WindowsXP Sp3专业版 V2021.05
10番茄花园 GHOST XP SP3 纯净专业版 V2021.03
热门教程 更多+
装机必备 更多+
重装教程 更多+
电脑教程专题 更多+