Home  >  Article  >  Backend Development  >  Summary of two methods of executing shell in python

Summary of two methods of executing shell in python

高洛峰
高洛峰Original
2017-02-07 17:20:041239browse

1. Use python’s built-in commands module to execute the shell

commands encapsulates Python’s os.popen(), uses the SHELL command string as its parameter, and returns the result data of the command and the status of the command execution. ;

This command is currently abandoned and replaced by subprocess;

# coding=utf-8
'''
Created on 2013年11月22日
  
@author: crazyant.net
'''
import commands
import pprint
  
def cmd_exe(cmd_String):
  print "will exe cmd,cmd:"+cmd_String
  return commands.getstatusoutput(cmd_String)
  
if __name__=="__main__":
  pprint.pprint(cmd_exe("ls -la"))

2. Use python’s latest subprocess module to execute the shell

Python has currently Abandoned os.system, os.spawn*, os.popen*, popen2.*, commands.* to execute commands in other languages, subprocesss is the recommended method;

subprocess allows you to create many subprocesses When creating a process, you can specify the subprocess and the input, output, and error output pipes of the subprocess. After execution, you can obtain the output results and execution status.

# coding=utf-8
'''
Created on 2013年11月22日
  
@author: crazyant.net
'''
import shlex
import datetime
import subprocess
import time
  
def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
  """执行一个SHELL命令
      封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr
      参数:
    cwd: 运行命令时更改路径,如果被设定,子进程会直接先更改当前路径到cwd
    timeout: 超时时间,秒,支持小数,精度0.1秒
    shell: 是否通过shell运行
  Returns: return_code
  Raises: Exception: 执行超时
  """
  if shell:
    cmdstring_list = cmdstring
  else:
    cmdstring_list = shlex.split(cmdstring)
  if timeout:
    end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
   
  #没有指定标准输出和错误输出的管道,因此会打印到屏幕上;
  sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE,shell=shell,bufsize=4096)
   
  #subprocess.poll()方法:检查子进程是否结束了,如果结束了,设定并返回码,放在subprocess.returncode变量中
  while sub.poll() is None:
    time.sleep(0.1)
    if timeout:
      if end_time <= datetime.datetime.now():
        raise Exception("Timeout:%s"%cmdstring)
       
  return str(sub.returncode)
  
if __name__=="__main__":
  print execute_command("ls")

You can also specify stdin and stdout as a variable in Popen, so that you can directly receive the output variable value.

Summary

It is sometimes necessary to execute SHELL in python, such as using Python's thread mechanism to start different shell processes. Currently, subprocess is the officially recommended method of Python, and its supported functions It is also the most popular and is recommended for everyone to use.

Okay, that’s the entire content of this article. I hope the content of this article can be of some help to everyone’s study or work. If you have any questions, you can leave a message to communicate.

For more related articles summarizing the two methods of executing shell in python, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn