调用系统命令的几种方法
博客专区 > dfkjih 的博客 > 博客详情
调用系统命令的几种方法
dfkjih 发表于2年前
调用系统命令的几种方法
  • 发表于 2年前
  • 阅读 11
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

1. os.system

In [32]: run = os.system("date")
Thu Jan 28 09:41:25 CST 2016
In [33]: run
Out[33]: 0

只能得到返回值,无法得到输出。

2. os.popen

In [35]: run = os.popen("date")
In [36]: run.read
Out[36]: <function read>
In [37]: run.read()
Out[37]: 'Thu Jan 28 09:43:14 CST 2016\n'

只能得到输出,无法得到返回值。

3. commands模块

In [39]: run = commands.getstatusoutput("date")
In [40]: run
Out[40]: (0, 'Thu Jan 28 09:44:44 CST 2016')

返回一个数组。

4. subprocess模块

4.1 call

In [42]: run = subprocess.call(["uname","-a"], shell=True)
Linux
In [43]: run
Out[43]: 0

直接输出结果,将返回值赋值给变量,类似os.system

4.2 Popen

In [44]: run = subprocess.Popen("uname -a", shell=True,stdout=subprocess.PIPE)
In [48]: run.stdout.read()
Out[48]: 'Linux test-sun207 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux\n'
In [49]: run.wait()
Out[49]: 0

注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现错误。

5. sh模块

安装:pip install sh

In [62]: from sh import ifconfig
In [63]: run = sh.ifconfig
In [64]: run
Out[64]: <Command '/usr/sbin/ifconfig'>
In [65]: run()
Out[65]: 
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.207  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe71:888  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:71:08:88  txqueuelen 1000  (Ethernet)
        RX packets 95617464  bytes 8518940518 (7.9 GiB)
        RX errors 0  dropped 7078520  overruns 0  frame 0
        TX packets 1175268  bytes 172715015 (164.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 191  bytes 58512 (57.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 191  bytes 58512 (57.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
In [67]: run.bake()
Out[67]: <Command '/usr/sbin/ifconfig'>
In [68]: run('lo')
Out[68]: 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 191  bytes 58512 (57.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 191  bytes 58512 (57.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

执行脚本:

import sh
run = sh.Command("/home/amoffat/run.sh") # Absolute path
run()

多个参数:

from sh import tar
tar("cvf", "/tmp/test.tar", "/my/home/directory")

关键字参数:

# resolves to "curl http://duckduckgo.com/ -o page.html --silent"
curl("http://duckduckgo.com/", o="page.html", silent=True)
# or if you prefer not to use keyword arguments, this does the same thing:
curl("http://duckduckgo.com/", "-o", "page.html", "--silent")
# resolves to "adduser amoffat --system --shell=/bin/bash --no-create-home"
adduser("amoffat", system=True, shell="/bin/bash", no_create_home=True)
# or
adduser("amoffat", "--system", "--shell", "/bin/bash", "--no-create-home")

返回值:

output = ls("/")
print(output.exit_code) # should be 0
#捕获异常:
try: print(ls("/some/non-existant/folder"))
except ErrorReturnCode_2:
    print("folder doesn't exist!")
    create_the_folder()
except ErrorReturnCode:
    print("unknown error")
    exit(1)

###:

In [92]: sh.ls(sh.glob('*.txt'))
Out[92]: requirements.txt

tail:

In [93]: for line in sh.tail("-f", "requirements.txt", _iter=True):
   ....:     print line  #实现其他更好玩的功能
   ....:     
requests==2.9.0
six==1.10.0
slip==0.4.0
#callback实现:
def process_output(line):
    print(line)
p = tail("-f", "/var/log/some_log_file.log", _out=process_output)
p.wait()


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 21
码字总数 13951
×
dfkjih
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: