python3 调用 Linux 脚本
网上很多教程,很多都是说的2时代的。
这里把3实验过的命令记录下来
首先,如果只需要执行,或者只需要得到执行的状态可以用 os.system 调用
#!/usr/bin/env python3
print ('hello,world')
#
import os
val2 = os.system('cd trb && cd trb')
val3 = os.system('ls') print('val2 is ',val2)
上述代码。如果val2内代码执行成功,即有两级trb文件夹,则val2 的值是0 否则是256
两行调用没有继承性,如果要连续执行就在一个语句里加 && (Shell 语法)
在print之前,屏幕还会显示执行的结果
hello,world
sh: line : cd: trb: 没有那个文件或目录
Abcd.py automesh.sh Cal_Ori fold.txt Linux_py_temp.py meshedjob.rec new_geom onc143314 trb
val2 is
#
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 : cd: trb: 没有那个文件或目录 Abcd.py
automesh.sh
Cal_Ori
fold.txt
Linux_py_temp.py
meshedjob.rec
new_geom
onc143314
trb
这里输出是类文件的对象,要调用read或者readlines读取也可以用来遍历。
###
终极武器,subprocess
py3.5后建议使用的模块subprocess
网上教程里的commands 是2里的功能,在3里被删除,但是可以通过subprocess调用
有以下命令:
subprocess.getstatusoutput(cmd )
在shell中返回执行cmd。(status, output) 返回2个元素的元组
3.4之后添加win支持
subprocess.getoutput(cmd )
执行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.sh
drwxr-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.rec
drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom
drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314
drwxr-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650
drwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840
drwxr-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 python3
print ('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 subprocess recomd = 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
python3 调用 Linux 脚本的更多相关文章
- Java远程调用Linux脚本
参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813 http://blog.csdn.net/a19881029/artic ...
- java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)
java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...
- linux+php+apache web调用python脚本权限问题解决方案
lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...
- linux+php+apache web调用python脚本权限问题
lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...
- 如何在java程序中调用linux命令或者shell脚本
转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...
- Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)
依赖包(附件有下载): 包名 类型 操作系统 luajava-1.1.jar jar ALL libluajava-1.1.so .so linux luajava-1.1.dll .dll wind ...
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
一.引言 学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写L ...
- java远程调用linux的命令或者脚本
转载自:http://eksliang.iteye.com/blog/2105862 Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 使用步骤如下 ...
- Linux脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
随机推荐
- Navicat连接到服务器端数据库
https://blog.csdn.net/javakklam/article/details/80060866
- Android 开发 存储目录的详解
简介 Android设备,有3个地方的文件存储位置,他们分别是: 内部存储空间(用户无法浏览到此目录) 外部存储空间(就是手机自身的文件管理目录,用户可以浏览) SD卡的存储空间(需要插入T卡) Sh ...
- python自动化,使用unittest对界面操作,读取excel表格数据输入到页面查询结果,在把结果保存到另外一张excel中
# -*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom ...
- base编码解码
function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, func ...
- Verilog笔记——Verilog数字系统设计(第二版)夏宇闻
本片记录Verilog学习笔记,主要是和以往用的C语言的不同之处,以例子.代码的形式记录.学习以<Verilog数字系统设计>(第二版)为参考资料,援助作者夏宇闻. 1. C语言和Veri ...
- zabbix通过agent添加监控项的步骤
1.确定要监控的对象的指标 2.在agent端上,把如何具体获取指标写成shell脚本,并放在一个和其它agent端统一的位置上 3.在agent端上,自定义监控项key值,配置zabbix_agen ...
- Linux命令:内建命令
本文对内建命令进行归类,便于学习和记忆. 分类 内建命令 同义词 功能相反命令 定义&声明类 alias unalias declare typeset local reado ...
- 排序大集合java
今日面试被问到排序问题,发现自己的不足,特来查漏补缺: 首先是各大排序算法的总结表 排序算法大合集 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 冒泡排序 Ο(n2) Ο(n) ...
- linux上如何设置网络,出现connect: network is unreachable 的问题。
发现有网友问有关ping命令出现connect: network is unreachable 的问题. 这通常是因为没正确设置ip地址. 解决方法: 在确保完善网卡驱动,以及确保将网卡驱动编译进内核 ...
- SHA-256算法和区块链原理初探
组内技术分享的内容,目前网上相关资料很多,但读起来都不太合自己的习惯,于是自己整理并编写一篇简洁并便于(自己)理解和分享的文章. 因为之前对密码学没有专门研究,自己的体会或理解会特别标注为" ...