Python学习---重点模块之subprocess
subprocess是用来执行系统程序,查看系统的模块,
查看当前目录
第一种方法:
1 2 3 4 5 6 | import subprocess # subprocess会单独自己开辟一个线程,内部是多线程 # stdout=subprocess.PIPE 利用管道将输出的内容输出由子进程转换到主进程 obj = subprocess.Popen( 'dir' , shell = True , stdout = subprocess.PIPE) print (obj) # <subprocess.Popen object at 0x00000000009A7B00> print ( str (obj.stdout.read(), 'gbk' )) # 编码用GBK,默认在当前文件所在的文件路径 |
第二种更简单:
1 2 | import subprocess print (subprocess.getoutput( 'dir' )) |
第三种:利用os.system()
1 2 | import os print (os.system( 'dir' )) |
执行某个脚本/命令
1 2 3 4 5 6 7 | # 方法一 tracker_obj = subprocess.Popen( "%s %s" % (session_tracker_script, md5_str), shell = True , stdout = subprocess.PIPE, stderr = subprocess.PIPE, # 这个cwd命名式指定python运行的路径的 cwd = settings.BASE_DIR) # 方法二: 根Popen的区别是,run可以让程序在后台运行 ssh_instance = subprocess.run(login_cmd, shell = True )<br><br>subprocess的cwd的参数使用: |
1 2 3 4 5 6 7 | >>> import subprocess >>> subprocess.run( "pwd" ) /home/omc/CityHunter CompletedProcess(args= 'pwd' , returncode= 0 ) >>> subprocess.run( "pwd" , cwd= "/tmp" ) /tmp CompletedProcess(args= 'pwd' , returncode= 0 ) |
1 |
Python下subprocess的交互
1>Python下的交互之subprocess.Popen
1 2 3 4 5 6 | omc@omc-virtual-machine:~/sshpass-1.06$ python3 Python 3.5.2 ( default , Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help" , "copyright" , "credits" or "license" for more information. >>>import subprocess >>>subprocess.Popen( "sshpass -p FTL200@HHH ssh root@192.168.25.133 -o 'StrictHostKeyChecking no'" , shell= True , stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 【远程交互】 |
1 2 3 4 5 6 7 8 9 10 11 12 | >>> subprocess.Popen( "df -h" , shell= True , stdin=subprocess.PIPE, stderr=subprocess.PIPE) <subprocess.Popen object at 0x7f93b22d10f0> 【本机的命令执行】 >>> Filesystem Size Used Avail Use% Mounted on udev 472M 0 472M 0% /dev tmpfs 99M 6.2M 93M 7% /run /dev/sda1 14G 4.9G 8.2G 38% / tmpfs 492M 188K 492M 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 492M 0 492M 0% /sys/fs/cgroup tmpfs 99M 28K 99M 1% /run/ user /108 tmpfs 99M 0 99M 0% /run/ user /1000 从上可以看出,subprocess.Popen并不能实现远程机器的实时交互,所有的输出信息都输入到了管道里,需要手动去读取内容,此时就无法实现输入信息了,所以实时交互用subprocess.Popen不行;但却可以达到本机的命令解析的效果。 |
2>Python下的交互之subprocess.run
1 2 3 4 5 6 7 8 9 | omc@omc-virtual-machine:~/sshpass-1.06$ python3 Python 3.5.2 ( default , Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help" , "copyright" , "credits" or "license" for more information. >>> import subprocess >>>subprocess.run( "sshpass -p FTL200@HH ssh root@192.168.25.133 -o 'StrictHostKeyChecking no'" , shell= True ) Last login: Mon May 7 07:01:56 2018 from 192.168.25.110 [root@localhost ~]# ifconfig|grep eth2 eth2 Link encap:Ethernet HWaddr 00:0C:29:E4:35:5D |
总结一下:python直接切换Linux下的shell可以用Python下的subprocess的run()来实现实时的交互。【超牛逼】
作者:小a玖拾柒
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步