Что-то странное происходит, так что я собираюсь вставить мой real
код вместе со сценарием 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
}
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 создает CSV-файл, который может быть проанализирован с помощью этого кода Python.
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 ... кроме это сложно запустить PowerShell, как администратор из Python, поэтому я использую этот
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
Файл CSV, созданный этим монстром, не может быть проанализирован моим скриптом Python.
выход CSV
"cpus","state","name","ram","uptime"
"1","Running","vm1","268435456","00:35:46"
"2","Off","vm2","536870912","00:00:00"
Для PowerShell, связанных с этим вопросом, мне было бы любопытно, если первая строка в файле - это ваш заголовок или строка типа. Независимо от того, ваш CSV выглядит правильно? – Matt
Не могли бы вы изменить 'print str (ex)' на 'raise ex' и включить трассировку? – jedwards
Вы уверены, что эти строки не исполняются ?. Просто потому, что он не печатает то, что вы ожидаете, это не значит, что они не исполняются. Используйте отладчик или некоторые операторы печати, чтобы убедиться, что эти строки не выполняются. –