博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3 调用 Linux 脚本
阅读量:4975 次
发布时间:2019-06-12

本文共 4611 字,大约阅读时间需要 15 分钟。

网上很多教程,很多都是说的2时代的。

 

这里把3实验过的命令记录下来

 

首先,如果只需要执行,或者只需要得到执行的状态可以用 os.system 调用

 

#!/usr/bin/env python3print ('hello,world')#import osval2 =  os.system('cd trb && cd trb')val3 = os.system('ls')print('val2 is ',val2)

上述代码。如果val2内代码执行成功,即有两级trb文件夹,则val2 的值是0  否则是256

两行调用没有继承性,如果要连续执行就在一个语句里加 && (Shell 语法)

在print之前,屏幕还会显示执行的结果

hello,worldsh: line 0: cd: trb: 没有那个文件或目录Abcd.py  automesh.sh  Cal_Ori  fold.txt  Linux_py_temp.py  meshedjob.rec  new_geom  onc143314  trbval2 is  256

#

 

os.popen(cmd)方法,只能得到运行的输出,但是如果不print屏幕上就什么也没有。

例如

val4 = os.popen('cd trb && cd trb')val5 = os.popen('ls')print('开始PRINT')print(val4.read())print(val5.read())

显示如下

hello,world开始PRINT/bin/sh: line 0: cd: trb: 没有那个文件或目录Abcd.pyautomesh.shCal_Orifold.txtLinux_py_temp.pymeshedjob.recnew_geomonc143314trb

 

这里输出是类文件的对象,要调用read或者readlines读取也可以用来遍历。

###

终极武器,subprocess

py3.5后建议使用的模块subprocess

 

网上教程里的commands 是2里的功能,在3里被删除,但是可以通过subprocess调用

有以下命令:

subprocess.getstatusoutputcmd 

在shell中返回执行cmd(status, output) 返回2个元素的元组

3.4之后添加win支持

subprocess.getoutputcmd 

 

执行cmd然后返回结果

legacycmd = subprocess.getstatusoutput('ls -l')print('subprocess.getstatusoutput 输出',legacycmd)legacycmd2 = subprocess.getoutput('ls -l')print('subprocess.getoutput 输出',legacycmd2)

上面为代码

输出:

subprocess.getstatusoutput 输出 (0, '总用量 48\n-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py\n-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58                     automesh_onpsn_fortest.sh\n-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.sh\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori\n-rw-r                    --r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt\n-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py\n-rw-r--r-- 1 para036 bjpara   27                     4月  15 14:43 meshedjob.rec\ndrwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geom\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314\ndrwx                    r-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650\ndrwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840\ndrwxr-xr-x 2 para036 bjpara 4096 4                    月  15 14:32 trb')subprocess.getoutput 输出 总用量 48-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58 automesh_onpsn_fortest.sh-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.shdrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori-rw-r--r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py-rw-r--r-- 1 para036 bjpara   27 4月  15 14:43 meshedjob.recdrwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geomdrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314drwxr-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650drwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840drwxr-xr-x 2 para036 bjpara 4096 4月  15 14:32 trb

  其中output是字符串。如果不print就不显示

 

新的版本推荐使用subprocess.run() 来解决一般问题。 

subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成

run默认不会返回输出,只返回命令和执行状态

recomd = subprocess.run(['ls','-l'])#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd\n',recomd)print(recomd.returncode)

输出如下:

 

 如果要返回输出,要添加参数,传递subprocess.PIPE给stdout和stderr,然后可以通过返回的CompletedProcess类实例的stdout和stderr属性或捕获相应的内容;

universal_newlines: 该参数影响的是输入与输出的数据格式,比如它的值默认为False,此时stdout和stderr的输出是字节序列;当该参数的值设置为True时,stdout和stderr的输出是字符串。

总代码如下:

#!/usr/bin/env python3print ('hello,world')#import os# val2 =  os.system('cd trb && cd trb')# val3 = os.system('ls')## print('val2 is ',val2)# val4 = os.popen('cd trb && cd trb')## val5 = os.popen('ls')# print('开始PRINT')# print(val4.read())# print(val5.read())import subprocessrecomd = subprocess.run(['ls','-l'])#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd\n',recomd)print(recomd.returncode)print('传递参数')recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)print('输出outerr',recomdouterr.stdout,recomdouterr.stderr)print('传递参数2')recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,universal_newlines=True)print('输出outerr',recomdouterr.stdout)print(len( recomdouterr.stdout.strip().split('\n') ))print(recomdouterr.stdout.strip().split('\n')[-1])# legacycmd = subprocess.getstatusoutput('ls -l')## print('subprocess.getstatusoutput 输出',legacycmd)## legacycmd2 = subprocess.getoutput('ls -l')## print('subprocess.getoutput 输出',legacycmd2)

  

 参考资料:python3.5 官方文档 : https://docs.python.org/3.5/library/subprocess.html

                  cnblogs:https://www.cnblogs.com/yyds/p/7288916.html

转载于:https://www.cnblogs.com/anloveslife/p/8847827.html

你可能感兴趣的文章
分布式系统事务一致性解决方案
查看>>
树梅派中文输入法支持
查看>>
[Git] 005 初识 Git 与 GitHub 之分支
查看>>
使用Analyze 和Instruments-Leaks分析解决iOS内存泄露
查看>>
Vue.js的入门
查看>>
【自定义异常】
查看>>
pip install 后 importError no module named "*"
查看>>
一些疑惑
查看>>
Codeforces Round #413 A. Carrot Cakes
查看>>
Linux(Ubuntu16.04)下添加新用户
查看>>
Windows c++应用程序通用日志组件(组件及测试程序下载)
查看>>
openstack dpdk
查看>>
springmvc跳转方式
查看>>
Linux安装Redis
查看>>
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
Redis中7种集合类型应用场景
查看>>
MariaDB 和 MySQL 比较
查看>>
MYSQL: 1292 - Truncated incorrect DOUBLE value: '184B3C0A-C411-47F7-BE45-CE7C0818F420'
查看>>
Java JPA @Transient 在Hibernate中应用
查看>>