设为首页 收藏本站
查看: 1131|回复: 0

[经验分享] Python 执行Shell 外部命令

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-8-8 13:36:50 | 显示全部楼层 |阅读模式
  1、os.system()
  此方法执行的外部程序,会将结果直接输出到标准输出。os.system的返回结果为执行shell 的 $? 值。
  因此请执行没有输出结果的程序时适合使用此方法。如touch 、rm 一个文件等。
In [1]: import os  
In [2]: os.system('touch test.txt')
  
Out[2]: 0
  
In [3]: os.system('rm -rf test.txt')
  
Out[3]: 0
  2、os.popen()
  此方法结合了os.system和 文件的特性。可以解决os.system那种无法获取程序执行结果的缺点
  os.popen 返回了一个类似与文件句柄的东西。可以对这个返回的结果做一些类似于对文件的操作
In [6]: output = os.popen('cat /etc/passwd')  

  
In [7]: for line in output.readlines():
  
   ...:     print line.strip()
  
   ...:
  
root:x:0:0:root:/root:/bin/bash
  
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  
bin:x:2:2:bin:/bin:/usr/sbin/nologin
  
sys:x:3:3:sys:/dev:/usr/sbin/nologin
  
sync:x:4:65534:sync:/bin:/bin/sync
  
games:x:5:60:games:/usr/games:/usr/sbin/nologin
  可以help(output) 获取相关帮助去操作这个output
  3、commands 模块
  这个模块主要提供了三个方法:
  (1)、getoutput(cmd)
  Return output (stdout or stderr) of executing cmd in a shell.
  返回一个shell 命令的标准输出或者时错误输出
In [17]: commands.getoutput('ls /home -l')  
Out[17]: 'total 4\ndrwxr-xr-x 31 admin admin 4096  5\xe6\x9c\x88  3 09:48 admin'
  

  
In [18]: commands.getoutput('ls /homeaaa -l')
  
Out[18]: 'ls: cannot access /homeaaa: No such file or directory'
  (2)、getstatus(file)
  Return output of "ls -ld <file>" in a string.
  获取一个文件的状态。 相当于执行了 ls -ld file
In [25]: commands.getstatus('/bin/ls')  
Out[25]: '-rwxr-xr-x 1 root root 110080  3\xe6\x9c\x88 24  2014 /bin/ls' // 相当于执行了 ls -ld /bin/ls
  

  
In [26]: os.system('ls -ld /bin/ls')
  
-rwxr-xr-x 1 root root 110080  3月 24  2014 /bin/ls
  (3)、getstatusoutput(cmd)
  Return (status, output) of executing cmd in a shell.
  返回shell 的状态码和输出结果
In [20]: commands.getstatusoutput('ls /home -l')  
Out[20]: (0, 'total 4\ndrwxr-xr-x 31 admin admin 4096  5\xe6\x9c\x88  3 09:48 admin')
  

  
In [21]: commands.getstatusoutput('ls /homeaa -l')
  
Out[21]: (512, 'ls: cannot access /homeaa: No such file or directory')
  4、subprocess 相关模块.
  从这个模块的帮助中可以看到。它的一个很主要的目的就是要替代掉os.system 、os.spawn*、os.popen*、popen2.* 、commands.*  这些模块的功能
  subproces 模块中一个很强大的类Popen,我们的主要学习重点应该在于此

  >  stdin=None, stdout=None, stderr=None,
  preexec_fn=None, close_fds=False, shell=False,
  cwd=None, env=None, universal_newlines=False,
  startupinfo=None, creationflags=0):
  args: 可以是一个字符串 或者是一个序列(list | tuple )。其实字符串也是序列呀。呵呵,我们这里就讲序列认为时list 和 tuple 了吧。若是序列时,则第一个元素为可执行的命令
  在unix 系统中, shell=Ture 和 shell=False(默认) 和 args 参数有一定的影响关系。
  看一下下面的列子:
  subprocess.Popen(["cat","/etc/passwd"])
  subprocess.Popen("cat /etc/passwd")
  我们看看以上这两种写法是否OK
In [29]: subprocess.Popen(["cat","/etc/passwd"])  
root:x:0:0:root:/root:/bin/bash
  
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  
bin:x:2:2:bin:/bin:/usr/sbin/nologin
  
sys:x:3:3:sys:/dev:/usr/sbin/nologin
  
sync:x:4:65534:sync:/bin:/bin/sync
  

  
In [30]: subprocess.Popen("cat /etc/passwd")
  
---------------------------------------------------------------------------
  
OSError                                   Traceback (most recent call last)
  第一种写法OK。第二种写法不OK。这是什么原因呢?
  主要时 shell=False(默认值) 这个参数搞的鬼。
  在UNIX中, shell=False 时 subprocess.Popen() 使用os.execvp()去执行响应的子程序。
  当 args 是一个字符串的时候,Popen 认为这个字符串是序列中的第一个元素(可执行的程序)。
  调用 os.execvp()的时候 ,到$PATH 中去找这个可执行程序,没有找到,所以程序出现了异常。
  不过这也分命令,若写成如下的形式:
  subprocess.Popen("/bin/pwd")
In [32]: subprocess.Popen("/bin/pwd")  
/home/dexin/python/tcollector
  以上这个就无所谓了。
  不过就是想让 subprocess.Popen("cat /etc/passwd") 能够正确的去执行,应该怎么办呢? 设置 shell=True .这样当再执行类似的程序时,会调用相应的shell 去做  shell -c "cat /etc/passwd"
subprocess.Popen("cat /etc/passwd",shell=True)  
Out[33]: <subprocess.Popen at 0x7f922a6b2350>
  

  
In [34]: root:x:0:0:root:/root:/bin/bash
  
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  
bin:x:2:2:bin:/bin:/usr/sbin/nologin
  
sys:x:3:3:sys:/dev:/usr/sbin/nologin
  
sync:x:4:65534:sync:/bin:/bin/sync
  
games:x:5:60:games:/usr/games:/usr/sbin/nologin
  
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
  
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548734-1-1.html 上篇帖子: python shell 爬虫 妹子图片 下篇帖子: python之函数isinstance
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表