Python Module_subprocess_调用 Powershell

简介: 目录目录前言Powershell call PythonPython call PowershellPowershell发送邮件最后前言使用Python内建的subprocess模块,能够实现外部程序的调用。

目录

前言

使用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来发送数据处理报告。实现的过程非常简便。

相关文章
|
13天前
|
Ubuntu Linux 测试技术
【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
|
14天前
|
缓存 监控 NoSQL
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
|
4月前
|
人工智能 运维 数据处理
PowerShell系列(二):PowerShell和Python之间的差异介绍
【1月更文挑战第4天】目前Python最火的编程语言,完整的生态、丰富的第三方资源库、丰富的社区文档教程,是目前人工智能、算法、数据处理分析等方面它属于最棒的编程语言,当然PowerShell作为微软官方推出的解释性语言,作为系统自动化运维脚本、数据处理分析语言还是非常值得学一学的。想对来说PowerShell目前的就业竞争小很多,未来还是非常有潜力的。
|
数据采集 JSON 搜索推荐
Python 调用Zoomeye搜索接口
钟馗之眼是一个强大的搜索引擎,不同于百度谷歌,它主要收集网络中的主机,服务等信息,国内互联网安全厂商知道创宇开放了他们的海量数据库,对之前沉淀的数据进行了整合、整理,打造了一个名符其实的网络空间搜索引擎ZoomEye,运用Python接口可以灵活的实现数据采集。
246 0
Python 调用Zoomeye搜索接口
|
数据安全/隐私保护 Python
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。
1181 1
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
|
Java C# 决策智能
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(下)
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(下)
|
Java 测试技术 C#
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(上)
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(上)
|
NoSQL Redis 开发工具
python调用redis-cell(CL.THROTTLE)
python调用redis-cell(CL.THROTTLE)
234 0
python调用redis-cell(CL.THROTTLE)
|
Linux Python
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
|
数据管理 测试技术 API
python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
在进行软件接口测试或设计自动化测试框架时,一个不比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xlrd、xlwt开源包来读写excel。例如:当我们登录的账号有多个的时候,我们一般用 excel 存放测试数据,本篇文章介绍,python 读取excel 方法,并保存为字典格式。
361 0
python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
下一篇
DDNS