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实现telnet客户端的方法
Apr 15 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python搭建Spark分布式集群环境
Jul 05 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python 使用office365邮箱的示例
Oct 29 Python
在终端启动Python时报错的解决方案
Nov 20 Python
python Tkinter模块使用方法详解
Apr 07 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实现更新中间关联表数据的两种方法
2014/09/01 PHP
php实现的通用图片处理类
2015/03/24 PHP
Nginx实现反向代理
2017/09/20 Servers
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
Jquery常用的方法汇总
2015/09/01 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Python字符串对象实现原理详解
2019/07/01 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
python跨文件使用全局变量的实现
2020/11/17 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
教育学专业毕业生的自我评价
2013/11/21 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
保证书格式范文
2014/04/28 职场文书
求职教师自荐书
2014/06/19 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
Promise静态四兄弟实现示例详解
2022/07/07 Javascript