subprocess.call

This is the recommended way to run shell commands in Python compared with old-fashioned os module.

This is a realtime method, which means you can get the shell output on the fly, compared with following "subprocess.check_output" method, which collect all output in its return value.

This method return the return value of the command, for example:

ret = subprocess.call('ls -l')

where ret=0, while

ret = subprocess.call('cd aaa')

ret=2 when there isn't "aaa" subfolder under CWD.

For ease of use, write a shorthand function:

import subprocess
def run(cmd):
ret = subprocess.call(cmd, shell=True)
if ret != 0:
sys.exit('Exec cmd %s error, return value: %s' %(cmd, str(ret)))

Then you can simply use "run(cmd)" as a shell interface. "run" print command stdout stderr to console stdout, and if there's something wrong during execution, we interrupt it.

subprocess.check_output

A more safe way to run shell command is using "check_output" function. If the return value if not 0, a exception raised, otherwise return the command output.

$ cat myrun.py
import subprocess
def run(cmd):
return subprocess.check_output(cmd, shell=True)
$ python -i myrun.py
>>> ret = run('ls -l|grep donno')
>>> ret
'drwxr-xr-x 6 chad chad 4096 Jan 26 18:18 donno-0.1.10\n-rw-r--r-- 1 chad chad 8716 Jan 27 15:53 donno-0.1.10.tar.gz\n'
>>> ret = run('cd aaa')
/bin/sh: 1: cd: can't cd to aaa
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "shtest.py", line 3, in run
return subprocess.check_output(cmd, shell=True)
File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'cd aaa' returned non-zero exit status 2

subprocess.Popen

If you want some more powerful tools, use this. You can't use pipe directly in this form. Instead, You have to use subprocess.PIPE:

>>> import subprocess
>>> lsres = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
>>> grepres = subprocess.Popen(['grep', 'Do'], stdin=lsres.stdout, stdout=subprocess.PIPE)
>>> res = grepres.communicate()

communicate() interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. It returns a tuple (stdoutdata, stderrdata).

Full solution of running shell command

If you want realtime output, while saving output and return code in variables, you should use Popen:

from subprocess import Popen, PIPE, STDOUT
cmd = 'vmstat 2 3'
cmd2 = 'exit 3' p = Popen(cmd, close_fds=True, shell=True, stdout=PIPE, stderr=STDOUT) line = ''
while p.poll() is None:
out = p.stdout.read(1)
if out=='\n':
print(line)
line = ''
else:
line = line + out
print('--------\nret is: %d' % p.returncode)

The Popen.stdout is a file object, so its "read(size)" method here means read every 1 byte.

"close_fds=True" is maybe unnecessary, but I keep it for safe.

os.system

If it's unnecessary to save command output, this is most convenient way. The output will output to console. You can use space and pipe in command:

>>> import os

>>> ret = os.system('ls -l|grep D')

And it will return after the command complete:

>>> ret = os.system('vmstat 3 3')

os.popen

Use this form if you want to save command output.

>>> retfile = os.popen('pwd')

>>> ret = retfile.read()

>>> ret

'/home/lichao\n'

>>> retfile

<open file 'pwd', mode 'r' at 0xb74aad30>

or write it more compact:

>>> result = os.popen('ls|grep enex').read()

Deprecated

  • commands.getoutput()

  • commands.getstatusoutput()

Run Shell Commands in Python的更多相关文章

  1. Testing shell commands from Python

    如何测试shell命令?最近,我遇到了一些情况,我想运行shell命令进行测试,Python称为万能胶水语言,一些自动化测试都可以完成,目前手头的工作都是用python完成的.但是无法从Python中 ...

  2. The Linux Mint 18.1:Eclipse Run The C++ And Python ConfigorationWhen You achieve above step,you can run the c++ and python! (Next OTL ,PYOTL is Project That Write By Ruimin Shen(ability man) )

    # Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 1.Install The Eclipse,g++ Use T ...

  3. The Linux Mint 17.1:Eclipse Run The C++ And Python Configoration

    p { margin-bottom: 0.1in; line-height: 120% } # Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights rese ...

  4. linux下Tab及shell 补全python

    Python自动补全 Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. vim python自动补全插件:pydiction 可以实现下 ...

  5. shell如何向python传递参数,shell如何接受python的返回值

    1.shell如何向python传递参数 shell脚本 python $sendmailCommandPath $optDate python脚本 lastDateFormat = sys.argv ...

  6. Frequently Used Shell Commands

    [Common Use Shell Commands] 1.ps aux:查看当前所有进程 ,以用户名为主键.可以查看到 USER.PID.COMMAND(binary所有位置) 2.netstat ...

  7. shell脚本安装python、pip--这种写法是错误的---每一个命令执行完都要判断是否执行成功,否则无法进行下一步

    shell脚本安装python.pip--不需要选择安装项目--不管用总报错,必须带上判断符号,while没有这种用法,写在这里为了以后少走弯路,所以不要用下面的执行了 首先把pip-.tgz 安装包 ...

  8. 用户添加到sudoer列表## Allow root to run any commands anywhere root ALL=(ALL) ALL Iron ALL=(ALL) ALL

    将用户添加到sudoer列表 李序锴关注 2017.12.20 15:03:25字数 605阅读 4,067 默认情况下,linux没有将当前用户列入到sudoer列表中(在redhat系列的linu ...

  9. shell脚本调用python模块

    python helloworld.py代码为 # coding:utf-8 from __future__ import print_function import sys print(sys.pa ...

随机推荐

  1. 在Docker运行的Nignx内部署前后端分离项目

    环境准备: Linux服务器: IP: 192.168.1.10 前端打包后的Vue项目: Port-3000, 请求地址192.168.1.10:8080 后端打包后的Java项目: Port-80 ...

  2. Spring中的<context:annotation-config/>配置

    当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如: 使用@Autowired注解,必须事先在Spring容器中声明AutowiredA ...

  3. 关于kong | API Gateway

    目录 为什么需要 API 网关(more) kong的概念 为什么使用Kong Kong 的管理方式 高可扩展性的背后-插件机制 [前言]: Kong是一个云原生,高效,可扩展的分布式 API 网关. ...

  4. YAOI Round #7 题解

    前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/16 Div.2 : http://47.110.12.131:9016/contest/15 D ...

  5. 关于hive的基础

    Hive基础 1.引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 事实上,许多底层细节实际 ...

  6. WORD2010

    WORD2010表格,利用公式计算第一行,将光标定位到第二行相应位置,点F4即可进行相应的运算,第三行,相应位置,再点F4,继续计算

  7. ADB 关闭指定应用 并打开

    import subprocess,time sjh="192.168.1.102:5555" aa1="adb -s {0} shell pm clear com.ku ...

  8. hapv-一个可以播放,下载国内主流视频的播放器

    electron 开发的一个可以播放,下载国内主流视频的播放器.A player developed by electron that can play and download domestic m ...

  9. debian 9 pycharm安装

    官网下载PyCharm的tar.gz格式 使用命令进行解压:tar -xvzf pycharm.tar.gz 解压后将pycharm文件夹移动到/usr/local/lib/目录下 进入pycharm ...

  10. 第1天 Mark Down 学习及DOS命令

    Markdown学习 标题 "#加空格"几个#就表示几级标题 字体 helloworld!一两个两个*号 helloworld!一边一个*号 helloworld! 一边三个号 h ...