Python 无法分析使用PowerShell生成的CSV

Python 无法分析使用PowerShell生成的CSV,python,parsing,powershell,csv,Python,Parsing,Powershell,Csv,有些奇怪的事情正在发生,所以我要将我的真实代码与PowerShell脚本一起粘贴,这可能很糟糕,但是嘿 import-module hyper-v $vms = get-vm | select name $allvms = @() function getRAM { param([string]$vmname ) $ram = get-vm -name $vmname | select -ExpandProperty memorystartup return $ram } funct

有些奇怪的事情正在发生,所以我要将我的真实代码与PowerShell脚本一起粘贴,这可能很糟糕,但是嘿

import-module hyper-v

$vms = get-vm | select name
$allvms = @()

function getRAM
{
 param([string]$vmname )
 $ram = get-vm -name $vmname | select -ExpandProperty memorystartup
 return $ram
}

function getState
{
 param([string]$vmname )
 $state = get-vm -name $vmname | select -ExpandProperty state
 return $state
}

function getUptime
{
 param([string]$vmname )
 $uptime = get-vm -name $vmname | select -ExpandProperty uptime
 return $uptime
}

function getCPUS
{
 param([string]$vmname )
 $cpus = get-vmprocessor -vmname $vmname | select -ExpandProperty count
 return $cpus
}

foreach ($vm in $vms)
    {
    $tempvm = New-Object PSObject
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name cpus -Value ""
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name state -Value ""
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name name -Value $vm.name
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name ram -Value ""
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name uptime -Value ""

    $tempvm.ram = getRAM($vm.name)
    $tempvm.state = getState($vm.name)
    $tempvm.cpus = getCPUS($vm.name)
    $tempvm.uptime = getUptime($vm.name)

    $allvms += $tempvm
    }

$allvms | export-csv c:/users/my_username/appdata/local/temp/vmi.csv -NoTypeInformation
从提升的PowerShell运行此命令将创建可以使用此Python代码解析的CSV文件

def _parseCSV(self):
        pwd = os.getcwd()
        os.chdir(tempfile.gettempdir())
        print 'currently in dir', os.getcwd()
        try:
            csvfile = open('vmi.csv', 'r')

            reader = csv.reader(csvfile)
            print type(reader), reader
            for row in reader:
                    print row
            os.chdir(pwd)
            print 'currently in dir', pwd
        except Exception as ex:
            raise ex
        finally:
            csvfile.close()
使用常规PowerShell运行它会生成一个空文件,可能是Hyper-V模块的故障

一个理想的场景是,我的Python代码执行上面的PowerShell脚本,该脚本写入CSV,稍后由同一个Python脚本解析……除了从Python以管理员身份运行PowerShell很棘手之外,所以我使用这个脚本

    def _runPowershell(self):
        sp.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                                 '-ExecutionPolicy',
                                 'Unrestricted',
                                 'Start-Process',
                                 'powershell',
                                 '-WindowStyle Hidden',
                                 '-verb',
                                 'runas',
                                 '-argumentlist',
                                 '"-file '+self.PSPath+'"'])
    #self.PSPath is c:/users/my_username/appdata/local/temp/vmi.ps1
我的Python脚本无法解析这个怪物生成的CSV文件

CSV输出

"cpus","state","name","ram","uptime"
"1","Running","vm1","268435456","00:35:46"
"2","Off","vm2","536870912","00:00:00"

代码工作正常,但PowerShell需要一些时间才能真正关闭并保存文件。为了解决这个问题,我在_parseCSV函数中添加了1秒pause time.sleep1。

为了让PowerShell与这个问题相关,我想知道文件中的第一行是标题还是类型行。不管您的CSV看起来是否正确?您是否可以将print strex更改为raise ex并包含回溯?您确定没有执行这些行吗?。仅仅因为它没有打印您期望的内容并不意味着它们没有被执行。使用调试器或一些打印语句来确保这些行没有被执行。csv.reader在文件中返回什么?vmi.csv文件是否在其中一个目录中?谢谢你们的关注,我已经用你们问题的答案更新了我的问题。