目录

前言

使用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的更多相关文章

  1. python调用powershell、远程执行bat

    python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist) { f ...

  2. python子类调用父类的方法

    python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...

  3. Python之调用函数

    Python之调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数. 可以直接从Python的官方网站查 ...

  4. Python下调用Linux的Shell命令

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  5. C#调用PowerShell脚本

    今天通过一个小例子,学习了C#如何调用PowerShell脚本文件的Function以及传参. private bool CallPowershell(string outputFile) { str ...

  6. Python脚本传參和Python中调用mysqldump

    Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...

  7. python 可调用对象之类实例

    可调用对象,即任何可以通过函数操作符()来调用的对象. python可调用对象大致可以分为4类: 1.函数 python中有三种函数:内建函数(BIFs).用户自定义函数(UDF).lambda表达式 ...

  8. Django之在Python中调用Django环境

    Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...

  9. 在python里调用java的py4j的使用方法

    py4j可以使python和java互调 py4j并不会开启jvm,需要先启动jvm server,然后再使用python的client去连接jvm GatewayServer实例:允许python程 ...

随机推荐

  1. 一道有关#define的题

    题目是:查看以下代码,问结果是什么? 结果是打印出“array:16345678910”吗? #include "stdafx.h" #include <iostream&g ...

  2. Codeforces Round #575 (Div. 3) D1+D2. RGB Substring (easy version) D2. RGB Substring (hard version) (思维,枚举,前缀和)

    D1. RGB Substring (easy version) time limit per test2 seconds memory limit per test256 megabytes inp ...

  3. CenterNet

    Objects as Points anchor-free系列的目标检测算法,只检测目标中心位置,无需采用NMS 1.主干网络 采用Hourglass Networks [1](还有resnet18 ...

  4. jquery 未来元素事件示例 on() delegate() live()

    jquery 1.7版后建议使用on() $(document).on("click","#green",function(){$(this).after('& ...

  5. Python核心技术与实战——十六|Python协程

    我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...

  6. DeepFaceLab更新至2019.12.19

    简而言之就是:人脸转换更加稳定和精确,切脸上下边界对齐,增加侧脸和嘴巴的识别面积,所以在这个版本之前的模型需要额外的训练.好消息是,如果你目前素材的嘴巴和侧脸识别有问题,可以重新提取脸部. 之前和之后 ...

  7. 如何使用 vue-cli 3 的 preset 打造基于 git repo 的前端项目模板

    vue-cli 之 Preset vue-cli 插件开发指南 TLDR 背景介绍 vue-cli 3 完全推翻了 vue-cli 2 的整体架构设计,所以当你需要给组里定制一份基于 vue-cli ...

  8. ArrayList为什么是线程不安全的

    首先需要了解什么是线程安全:线程安全就是说多线程访问同一代码(对象.变量等),不会产生不确定的结果. 既然说ArrayList是线程不安全的,那么在多线程中操作一个ArrayList对象,则会出现不确 ...

  9. 谈谈对AQS的一些理解

    AQS的概念 AQS全称AbstractQueuedSynchronizer,是java并发包中的核心类,诸如ReentrantLock,CountDownLatch等工具内部都使用了AQS去维护锁的 ...

  10. CodeForces-721A-One-dimensional Japanese Crossword

    链接: https://vjudge.net/problem/CodeForces-721A 题意: Recently Adaltik discovered japanese crosswords. ...