Python调用shell命令常用方法(4种)


Posted in Python onMay 11, 2020

方法一、使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未找到,该方法适用于shell命令不需要输出内容的场景。

举例说明:

1. 列举当前目录下的所有文件。

import os
val = os.system('ls -al')
print val

Python调用shell命令常用方法(4种)

没有找到时,sh返回的状态码是1,而适用python调用,返回的是:256

Python调用shell命令常用方法(4种)

方法二、使用os.popen(),该方法以文件的形式返回shell指令运行后的结果,需要获取内容时可使用read()或readlines()方法,举例如下:

Python调用shell命令常用方法(4种)

Python调用shell命令常用方法(4种)

方法三、使用commands模块,有三个方法可以使用:

(1)commands.getstatusoutput(cmd),其以字符串的形式返回的是输出结果和状态码,即(status,output)。

(2)commands.getoutput(cmd),返回cmd的输出结果。

(3)commands.getstatus(file),返回ls -l file的执行结果字符串,调用了getoutput,不建议使用此方法

Python调用shell命令常用方法(4种)

Python调用shell命令常用方法(4种)

方法四、subprocess模块,允许创建很多子进程,创建的时候能指定子进程和子进程的输入、输出、错误输出管道,执行后能获取输出结果和执行状态。

(1)subprocess.run():python3.5中新增的函数, 执行指定的命令, 等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。

(2)subprocess.call():执行指定的命令, 返回命令执行状态, 功能类似os.system(cmd)。

(3)subprocess.check_call():python2.5中新增的函数, 执行指定的命令, 如果执行成功则返回状态码, 否则抛出异常。

说明:subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

args:表示shell指令,若以字符串形式给出shell指令,如"ls -l "则需要使shell = Ture。否则默认已数组形式表示shell变量,如"ls","-l"。

当使用比较复杂的shell语句时,可以先使用shlex模块的shlex.split()方法来帮助格式化命令,然后在传递给run()方法或Popen。

Python调用shell命令常用方法(4种)

Python调用shell命令常用方法(4种)

附上python2.7中的subprocess模块源码供理解(pycharm查看方法源码,ctrl+左键)。

# Stubs for subprocess

# Based on http://docs.python.org/2/library/subprocess.html and Python 3 stub

from typing import Sequence, Any, Mapping, Callable, Tuple, IO, Union, Optional, List, Text

_FILE = Union[None, int, IO[Any]]
_TXT = Union[bytes, Text]
_CMD = Union[_TXT, Sequence[_TXT]]
_ENV = Union[Mapping[bytes, _TXT], Mapping[Text, _TXT]]

# Same args as Popen.__init__
def call(args: _CMD,
     bufsize: int = ...,
     executable: _TXT = ...,
     stdin: _FILE = ...,
     stdout: _FILE = ...,
     stderr: _FILE = ...,
     preexec_fn: Callable[[], Any] = ...,
     close_fds: bool = ...,
     shell: bool = ...,
     cwd: _TXT = ...,
     env: _ENV = ...,
     universal_newlines: bool = ...,
     startupinfo: Any = ...,
     creationflags: int = ...) -> int: ...

def check_call(args: _CMD,
        bufsize: int = ...,
        executable: _TXT = ...,
        stdin: _FILE = ...,
        stdout: _FILE = ...,
        stderr: _FILE = ...,
        preexec_fn: Callable[[], Any] = ...,
        close_fds: bool = ...,
        shell: bool = ...,
        cwd: _TXT = ...,
        env: _ENV = ...,
        universal_newlines: bool = ...,
        startupinfo: Any = ...,
        creationflags: int = ...) -> int: ...

# Same args as Popen.__init__ except for stdout
def check_output(args: _CMD,
         bufsize: int = ...,
         executable: _TXT = ...,
         stdin: _FILE = ...,
         stderr: _FILE = ...,
         preexec_fn: Callable[[], Any] = ...,
         close_fds: bool = ...,
         shell: bool = ...,
         cwd: _TXT = ...,
         env: _ENV = ...,
         universal_newlines: bool = ...,
         startupinfo: Any = ...,
         creationflags: int = ...) -> bytes: ...

PIPE = ... # type: int
STDOUT = ... # type: int

class CalledProcessError(Exception):
  returncode = 0
  # morally: _CMD
  cmd = ... # type: Any
  # morally: Optional[bytes]
  output = ... # type: Any

  def __init__(self,
         returncode: int,
         cmd: _CMD,
         output: Optional[bytes] = ...) -> None: ...

class Popen:
  stdin = ... # type: Optional[IO[Any]]
  stdout = ... # type: Optional[IO[Any]]
  stderr = ... # type: Optional[IO[Any]]
  pid = 0
  returncode = 0

  def __init__(self,
         args: _CMD,
         bufsize: int = ...,
         executable: Optional[_TXT] = ...,
         stdin: Optional[_FILE] = ...,
         stdout: Optional[_FILE] = ...,
         stderr: Optional[_FILE] = ...,
         preexec_fn: Optional[Callable[[], Any]] = ...,
         close_fds: bool = ...,
         shell: bool = ...,
         cwd: Optional[_TXT] = ...,
         env: Optional[_ENV] = ...,
         universal_newlines: bool = ...,
         startupinfo: Optional[Any] = ...,
         creationflags: int = ...) -> None: ...

  def poll(self) -> int: ...
  def wait(self) -> int: ...
  # morally: -> Tuple[Optional[bytes], Optional[bytes]]
  def communicate(self, input: Optional[_TXT] = ...) -> Tuple[Any, Any]: ...
  def send_signal(self, signal: int) -> None: ...
  def terminate(self) -> None: ...
  def kill(self) -> None: ...
  def __enter__(self) -> 'Popen': ...
  def __exit__(self, type, value, traceback) -> bool: ...

# Windows-only: STARTUPINFO etc.

STD_INPUT_HANDLE = ... # type: Any
STD_OUTPUT_HANDLE = ... # type: Any
STD_ERROR_HANDLE = ... # type: Any
SW_HIDE = ... # type: Any
STARTF_USESTDHANDLES = ... # type: Any
STARTF_USESHOWWINDOW = ... # type: Any
CREATE_NEW_CONSOLE = ... # type: Any
CREATE_NEW_PROCESS_GROUP = ... # type: Any

shell脚本使用python脚本的参数

写一个hello.sh脚本,需要传入两个参数:

Python调用shell命令常用方法(4种)

执行结果如下:

Python调用shell命令常用方法(4种)

在python脚本中调用shell脚本,并传入参数,注意参数前后要有空格

Python调用shell命令常用方法(4种)

执行python脚本

Python调用shell命令常用方法(4种)

到此这篇关于Python调用shell命令常用方法(4种)的文章就介绍到这了,更多相关Python调用shell命令内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python解析XML的几种常见方法的介绍
Apr 09 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
python调用支付宝支付接口流程
Aug 15 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
新手学python应该下哪个版本
Jun 11 Python
python中sort sorted reverse reversed函数的区别说明
May 11 #Python
python的reverse函数翻转结果为None的问题
May 11 #Python
Pyecharts地图显示不完成问题解决方案
May 11 #Python
将python字符串转化成长表达式的函数eval实例
May 11 #Python
python函数中将变量名转换成字符串实例
May 11 #Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 #Python
基于python实现获取网页图片过程解析
May 11 #Python
You might like
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
Views rows style模板重写代码
2011/05/16 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
jQuery数组处理方法汇总
2011/06/20 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
python基础教程之lambda表达式使用方法
2014/02/12 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
django框架ModelForm组件用法详解
2019/12/11 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
幼儿园义卖活动方案
2014/01/17 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
2014年内勤工作总结
2014/11/24 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
手写实现JS中的new
2021/11/07 Javascript
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS