Python调用Shell命令 (python,shell 混合编程)

这篇具有很好参考价值的文章主要介绍了Python调用Shell命令 (python,shell 混合编程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。

用Python调用Shell命令有如下几种方式:

1. os.system

os.system("The command you want").
os.system("lscpu").
os.system("ls -al").

这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以windows和linux是不一样的。

2. os.popen

os.popen(command[,mode[,bufsize]])

python调用shell命令,python,linux,开发语言,深度学习,学习

可以看出,popen方法通过p.read()获取终端输出,而且popen需要关闭close().当执行成功时,close()不返回任何值,失败时,close()返回系统返回值. 可见它获取返回值的方式和os.system不同。

3. 使用commands ( python3失效)

根据你需要的不同,commands模块有三个方法可供选择。getstatusoutput, getoutput, getstatus。

commands.getstatusoutput(cmd) 返回(status, output).
commands.getoutput(cmd) 只返回输出结果
commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法

但是,如上三个方法都不是Python推荐的方法,而且在Python3中其中两个已经消失。

4. subprocess《Python文档中目前全力推荐》

subprocess使用起来同样简单:

直接调用命令,返回值即是系统返回。shell=True表示命令最终在shell中运行。Python文档中出于安全考虑,不建议使用shell=True。建议使用Python库来代替shell命令,或使用pipe的一些功能做一些转义。官方的出发点是好的,不过真心麻烦了很多, so....

但是,我使用subprocess失败了

>>> import subprocess
>>> subprocess.call("cat %s |grep %s > %s " % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.6/subprocess.py", line 287, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib64/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out ': 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out '

python调用shell命令,python,linux,开发语言,深度学习,学习

但是,可以直接运行在shell里面:

python调用shell命令,python,linux,开发语言,深度学习,学习

同样的 我用os.system 去运行,也确实产生了。

>>> import os
>>> os.system("cat %s |grep %s > %s " % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))
256

源码研究:

python调用shell命令,python,linux,开发语言,深度学习,学习

这里面最为重要的几个参数是:.
args:要执行的shell命令,或者是命令的列表;
bufsize:缓冲区大小;。
stdinstdoutstderr:表示程序的标准输入、标准输出以及错误输出。
shell:是否直接执行命令,如果设置为True就表示可以直接执行;
cwd:当前的工作目录;
env:子进程环境变量;

python调用shell命令,python,linux,开发语言,深度学习,学习

subprocess模块里面还有一项功能比较强大的支持在于可以直接使用标准输入、标准输出和错误输出进行进程的数据通讯操作。

例如,在Python安装完成之后都会存在有交互式的编程环境,那么本次将通过程序调用交互式编程环境直接操作python命令行,在python命令行中直接输入程序。

def main():
subp_popen=subprocess.Popen("python.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
subp_popen.stdin.write("print('subp_popen.stdin.write1')\n".encode())
subp_popen.stdin.write("print('subp_popen.stdin.write2')\n".encode())
subp_popen.stdin.write(("print('subp_popen.stdin.write3'+1)").encode())
subp_popen.stdin.close()
cmd_out=subp_popen.stdout.read()
subp_popen.stdout.close()
print(cmd_out.decode())
cmd_err=subp_popen.stderr.read()
subp_popen.stderr.close()
print(cmd_err)
if __name__ == '__main__':
main()

python调用shell命令,python,linux,开发语言,深度学习,学习文章来源地址https://www.toymoban.com/news/detail-600339.html

到了这里,关于Python调用Shell命令 (python,shell 混合编程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell编程学习笔记39:df命令

    0 前言 1  df命令的功能、格式和选项说明 1.1 df命令的功能 1.2 df命令的格式 1.3 df命令选项说明  2 df命令使用实例  2.1  df:显示主要文件系统信息 2.2 df -a:显示所有文件系统信息 2.3 df -t[=]TYPE或--type[=]TYPE:显示TYPE指定类型的文件系统信息 2.4 df --total:追加显示统计信息 2

    2024年01月16日
    浏览(59)
  • Linux shell编程学习笔记47:lsof命令

    今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。 Linux shell编程学习笔记39:df命令 https://blog.csdn.net/Purpleendurer/article/details/135577571 于是开始清理磁盘空间。 第一步是查看已删除、但空间却没有释放的进程。 这里要用到 lsof命令。

    2024年04月27日
    浏览(43)
  • Linux shell编程学习笔记33:type 命令

     目录 0 引言 1 type 命令的功能和格式 1.1 type命令的功能 1.2 type 命令的格式 2 type命令用法实例 2.1用type命令查看shell内置命令(以echo命令为例) 2.2 用type命令查看别名(以ls命令为例) 2.3 用type命令同时查看shell内置命令和别名(以echo和ls命令为例) 2.4 用type命令查看外部

    2024年02月03日
    浏览(52)
  • Linux shell编程学习笔记40:stat命令

    “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀光芒,成为那个令HR们心动的程序猿!” 目录 0 前言 1 DOS、Wind

    2024年01月19日
    浏览(55)
  • Linux shell编程学习笔记37:readarray命令和mapfile命令

      目录   0 前言 1  readarray命令的格式和功能 1.1 命令格式 1.2 命令功能 1.3 注意事项 2 命令应用实例 2.1 从标准输入读取数据时不指定数组名,则数据会保存到MAPFILE数组中 2.2 从标准输入读取数据并存储到指定的数组 2.3 使用 -O 选项指定起始下标 2.4 用-n指定有效行数 2.5 

    2024年02月03日
    浏览(52)
  • Linux shell编程学习笔记45:uname命令-获取Linux系统信息

    linux 有多个发行版本,不同的版本都有自己的版本号。 如何知道自己使用的Linux的系统信息呢? 使用uname命令、hostnamectl命令,或者通过查看/proc/version文件来了解这些信息。 我们先看看uname命令。 我们可以使用命令 uname --help命令 查看它的用法: purpleEndurer @  bash ~ $ uname --

    2024年04月10日
    浏览(56)
  • Python调用adb shell

    在Android开发中,ADB(Android Debug Bridge)是一个非常重要的工具。它可以让我们通过命令行或者其他的客户端与安装了ADB驱动的Android设备进行通信,并进行一些调试操作。 Python作为一门灵活强大的语言,很自然就成为了用来控制ADB的工具之一。本文将介绍如何使用Python调用A

    2024年02月07日
    浏览(45)
  • Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

    目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】         在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行

    2024年02月09日
    浏览(41)
  • 【Linux命令行与Shell脚本编程】第十四章,呈现数据

    第十四章 呈现数据 1.1,标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.1.1,STDIN 标准输入 1.1.2,STDOUT 标准输出 1.1.3,STDERR 错误输出 1.2,重定向错误 1.2.1.只重定向错误 n 1.2.2.重定向错误消息和正常输出 2.1,临时重定向 2.2,永久重定向 exec 4

    2023年04月25日
    浏览(41)
  • Linux shell编程学习笔记6:查看和设置变量的常用命令

    上节我们介绍了变量的变量命名规则、变量类型、使用变量时要注意的事项,今天我们学习一下查看和设置变量的一些常用命令,包括变量的提升,有些命令在之前的实例中已经使用过了。 语法格式:echo [参数] [输出内容] 常用参数: -e:支持反斜线控制的字符转换(具体参

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包