Python Module_subprocess_调用 Powershell
目录
前言
使用Python内建的subprocess模块,能够实现外部程序的调用。如果你的工作环境是Windows系统,那么Python+Powershell的组合会为你的工作带来极大的便利。本篇介绍一个使用Python做数据处理,Powershell做系统调用的例子。
Powershell call Python
首先在Windows Server 2012 R2中使用Powershell脚本做数据收集,并存放到一个文件中。
#fileName = hd.ps1
#function for countdown
Function Countdown($number,$title,$text1,$text2='Pls Call Jmilk')
{
Write-Host "Exit the Script after $number seconds" -ForegroundColor Red
$Countdown = $number
for($PercentComplete = $Countdown; $PercentComplete -ge 0; $PercentComplete--)
{
Write-Progress -Activity $title -Status $text1 -CurrentOperation $text2 -SecondsRemaining $PercentComplete ;
Sleep -Seconds 1;
}
}#End Function Countdown
Write-Host "Welcome to use the script to create table for HI & OFR nodes status" -ForegroundColor Cyan
Write-Host "Building the file hd.txt...Pls be patient.The script will be auto-Exit after created the hd.txt file" -ForegroundColor Yellow
#Change the rdtools path
$rdtoolsPath = 'E:\Users\userName\rdtools'
cd $rdtoolsPath
$cmd = 'commands' #commands of Data-Collection 因为保密条约不能将内部指令对外
cmd /c $cmd | Out-File -FilePath E:\Users\userName\Desktop\hd.txt
#在powershell里调用了别的Shell所以需要使用cmd指令来实现环境变量的传递
#Out-File 将数据导出到文件
Write-Host 'Build Done' -ForegroundColor Green
#Powershell call python
Start-Process python E:\Users\userName\Desktop\hd.py
#在收集完数据后调用Python做数据处理
#结束并推出Powershell
Countdown 60 'Hd.ps1' 'Exiting...' 'Pls go to the next step!'
Python call Powershell
主要使用了subprocess模块,subproocess的详细介绍,点击这里
#coding:utf8
#FileName=hd.py
import os
import codecs
from openpyxl.workbook import Workbook
from openpyxl.writer.excel import ExcelWriter
from openpyxl.cell import get_column_letter
from openpyxl.cell import Cell
from openpyxl import Workbook
from openpyxl import load_workbook
import subprocess
#读取数据收集文件
def readFile(fileUrl):
"""Read the file and return the file content"""
try:
#unicode file
fileObject = codecs.open(fileUrl,'r',encoding='utf-16')
except unicodeDecodeError:
print "Pls check the encoding for hd.txt whether [unicode]"
else:
print("Unspecified Error,Pls call Jmilk")
try:
fileContent = fileObject.readlines()
finally:
fileObject.close()
return fileContent
#数据分类函数
def getNodeCountList(readLines):
"""Get the different node status type and change the global variable"""
i = 0
for line in readLines:
lineItem = line.split(':')
if lineItem[0] == '---- \r\n':
i += 1
continue
if lineItem[0] == ' Node State':
if lineItem[1] == ' Ready count':
global ReadyCount
ReadyCount[i-1] = int(lineItem[2])
if lineItem[1] == ' OutForRepair count':
global OutForRepairCount
OutForRepairCount[i-1] = int(lineItem[2])
if lineItem[1] == ' HumanInvestigate count':
global HumanInvestigateCount
HumanInvestigateCount[i-1] = int(lineItem[2])
#生成Excel表格
def createTable():
"""Create the HI‘s & OFR nodes status table"""
wb = Workbook()
ws = wb.worksheets[0]
ws.title = u"NodeCount"
for i in list(range(1,26)):
ws.cell("A"+str(i)).value = '%s' % (cluster[i-1])
ws.cell("B"+str(i)).value = '%s' % (HumanInvestigateCount[i-1])
ws.cell("C"+str(i)).value = '%s' % (OutForRepairCount[i-1])
ws.cell("D"+str(i)).value = '%s' % (ReadyCount[i-1])
ws.cell("E"+str(i)).value = '%.2f%s' %((float(HumanInvestigateCount[i-1])/(HumanInvestigateCount[i-1]+OutForRepairCount[i-1]+ReadyCount[i-1]))*100,'%')
wb.save("Hd.xlsx")
#Python call powershell 使用powershell实现发送数据处理邮件
def python_call_powershell(bodyStr):
args = [r"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe","-ExecutionPolicy","Unrestricted",r"E:\Users\userName\Desktop\SendMail.ps1",str(bodyStr)]
ps = subprocess.Popen(args,stdout=subprocess.PIPE)
psReturn = ps.stdout.read()
return psReturn
if __name__ == '__main__':
#Change to your user name
user = 'userName'
cluster = []
ReadyCount = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
OutForRepairCount = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HumanInvestigateCount = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
percentage = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
fileUrl = 'E:\\Users\\' + user + '\\Desktop\\hd.txt'
if os.path.exists(fileUrl):
readContent = readFile(fileUrl)
getNodeCountList(readContent)
#createTable()
else:
print('Not exist the file!')
for i in list(range(0,24)):
percentage[i] = '%.2f%s' % ((float(HumanInvestigateCount[i])/(HumanInvestigateCount[i]+OutForRepairCount[i]+ReadyCount[i]))*100,'%')
bodyStr = [x for li in [cluster,HumanInvestigateCount,OutForRepairCount,ReadyCount,percentage] for x in li]
for index in list(range(0,24)):
print cluster[index]+'\t',str(HumanInvestigateCount[index])+'\t',str(OutForRepairCount[index])+'\t',str(ReadyCount[index])+'\t'+percentage[index]
print bodyStr
callResult = python_call_powershell(bodyStr)
print callResult
Powershell发送邮件
#fileName = sendMail.ps1
#Set secure password
Function Set-SecurePwd($storage)
{
$mysecret = 'mailPassword'
$mysecret |
ConvertTo-SecureString -AsPlainText -Force |
ConvertFrom-SecureString |
Out-File -FilePath $storage
$pw = Get-Content $storage | ConvertTo-SecureString
return $pw
}#End Function Set-SecurePwd
#Sned Email
Function Send-Email($attach,$body)
{
#$pwd = Set-SecurePwd $storage
#$cred = New-Object System.Management.Automation.PSCredential "mailUsername",$pwd
$to = "XXX@XXX.com"
$from = "XXX@XXX.com"
$cc = "XXX@XXX.com"
$sub = "Number of statistics for Node status"
$smtp = "SMTP.163.COM"
Send-MailMessage -To $to -From $from -cc $cc -Subject $sub -Body $body -BodyAsHtml -SmtpServer $smtp -port 25 -Attachments $attach -Credential $cred -UseSsl
if($?)
{
Write-Host "Sent Successfully!" -ForegroundColor Green
}
else
{
Write-Host "Error" -ForegroundColor Red
}
}#End Function Send-Email
#Mail
$storage = "E:\Users\userName\Desktop\password.txt"
$attach = "E:\Users\userName\Desktop\Hd.xlsx"
$data = $args[0] #获取Python传递过来的参数
$date = Get-Date
$currentTime = "{0:G}" -f $date.AddHours(16)
$body = "<html>Report of data deal with</html>" #使用HTML的方式来自定义邮件格式
Send-Email $attach $body
Sleep 10
最后
在上面这个例子中,使用Powershell做数据收集,Python做数据处理,最后使用Powershell的内建方法Send-MailMessage来发送数据处理报告。实现的过程非常简便。
Python Module_subprocess_调用 Powershell的更多相关文章
- python调用powershell、远程执行bat
python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist) { f ...
- python子类调用父类的方法
python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...
- Python之调用函数
Python之调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数. 可以直接从Python的官方网站查 ...
- Python下调用Linux的Shell命令
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...
- C#调用PowerShell脚本
今天通过一个小例子,学习了C#如何调用PowerShell脚本文件的Function以及传参. private bool CallPowershell(string outputFile) { str ...
- Python脚本传參和Python中调用mysqldump
Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...
- python 可调用对象之类实例
可调用对象,即任何可以通过函数操作符()来调用的对象. python可调用对象大致可以分为4类: 1.函数 python中有三种函数:内建函数(BIFs).用户自定义函数(UDF).lambda表达式 ...
- Django之在Python中调用Django环境
Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...
- 在python里调用java的py4j的使用方法
py4j可以使python和java互调 py4j并不会开启jvm,需要先启动jvm server,然后再使用python的client去连接jvm GatewayServer实例:允许python程 ...
随机推荐
- python gRPC简单示例
Ubuntu18.04安装gRPC protobuf-compiler-grpc安装 sudo apt-get install protobuf-compiler-grpc protobuf-comp ...
- window环境安装composer
今天在下载symfony2的框架的时候,发现要用到composer,因为之前笔者完全没有接触过composer,所以研究了很久之后,才终于安装完成 由于网上有各种资料介绍如何安装composer的,但 ...
- BZOJ - 1036 树的统计Count (LCT)
LCT试炼题(代码量居然完爆树剖?) #include<bits/stdc++.h> using namespace std; ,inf=0x3f3f3f3f; ],flp[N],n,m, ...
- 【BZOJ1999】树网的核
题目大意:题目过长,无法简单描述... 题解: 由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可.要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可 ...
- redis中如何存储java对象
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式 存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用red ...
- day02 计算机基础部分作业题
1. 简述执行Python程序的两种方式以及他们的优缺点: 交互式: 优点:在cmd窗口环境下,运行Python解释器,执行一行代码打印一行,执行速度快,立马显示结果: 缺点:关闭窗口,被执行的代码和 ...
- docker小知识
1,docker 使用普通用户 添加用户组: sudo groupadd docker 加入docker 组 sudo gpasswd -a ${USER} docker 或 usermod -aG ...
- webpack-第一个demo
1.webpack概念 webpack是前端的一个项目构建工具,它是基于node.js开发出来的一个前端工具:借助webpack这个前端自动化构建工具,可以完美实现资源的合并.打包.压缩.混淆等诸多功 ...
- curl POST如何查看响应的Header(转)
curl -I 这样其实发送是HEAD请求. 下面这样发送POST请求(-X POST),同时指定Basic认证用户名密码(-u ‘andy:andy’),同时指定数据类型(-H ‘Content-T ...
- maven项目使用自己创建的jar包--maven without test code
eclipse版本为2018-12(4.10.0) 1.创建一个jar包 首先自己建立了一个maven project,名为jweb.GAV坐标: <groupId>amberai< ...