У меня проблема с подпроцессом. Откройте и, как я полагаю, каналы.У меня есть следующий блок кода, который работает без проблем 100% времени при запуске из Cli:
p = subprocess.Popen("psexec \\\\" + serverName.get() + " cmd /c \
ver & \
echo %USERDOMAIN% & \
dir /a C:\pagefile.sys | find \"pagefile.sys\" & \
dir C:\ | find \"bytes free\" & \
dir D:\ | find \"bytes free\" ", \
stdin=None, stdout=subprocess.PIPE, stderr=None)
### Assign the results from the Popen
results = p.communicate()[0]
rc = p.returncode
print 'results: ' + str(results)
sys.exit()
Вывод:
PsExec v1.90 - Execute processes remotely
Copyright (C) 2001-2007 Mark Russinovich
Sysinternals - www.sysinternals.com
The device is not ready.
cmd exited on XXXXXXX with error code 1.
Microsoft Windows XP [Version 5.1.2600]
PROD
02/23/2011 09:37 AM 1,610,612,736 pagefile.sys
49 Dir(s) 17,104,437,248 bytes free
У меня была завершена эта программа, но один разЯ скомпилировал его с помощью py2exe, он просто зависал или зависал.Я отследил эту проблему до py2exe, которому не нравятся неопределенные stdin, out или err в подпроцессе.Затем я изменил свой код следующим образом:
p = subprocess.Popen("psexec \\\\" + serverName.get() + " cmd /c \
ver & \
echo %USERDOMAIN% & \
dir /a C:\pagefile.sys | find \"pagefile.sys\" & \
dir C:\ | find \"bytes free\" & \
dir D:\ | find \"bytes free\" ", \
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p.stdin.close()
### Assign the results from the Popen
results = p.communicate()[0]
rc = p.returncode
print 'results: ' + str(results)
sys.exit()
Этот код также работает 100% времени, но когда я печатаю результаты, он показывает мне только стандартные сообщения psexec, а не вывод выполненных команд.
Вывод:
results:
PsExec v1.90 - Execute processes remotely
Copyright (C) 2001-2007 Mark Russinovich
Sysinternals - www.sysinternals.com
cmd exited on XXXXXXX with error code 1.
Я пытался бороться с этим, добавляя shell = true к параметрам подпроцесса, но когда я это делаю, программа просто зависает в 99% случаев.Это на самом деле будет работать 1% времени.Я заметил, что во время зависания программы, если я захожу в диспетчер задач и вручную убиваю процесс psexec, отображается желаемый результат.Это сводит меня с ума, и я искал вечно, ничего не находя.Код работает на WinXP python v2.7.Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или вам нужна дополнительная информация.
Код зависания:
p = subprocess.Popen("psexec \\\\" + serverName.get() + " cmd /c \
ver & \
echo %USERDOMAIN% & \
dir /a C:\pagefile.sys | find \"pagefile.sys\" & \
dir C:\ | find \"bytes free\" & \
dir D:\ | find \"bytes free\" ", \
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
p.stdin.close()
### Assign the results from the Popen
results = p.communicate()[0]
rc = p.returncode
print 'results:' + str(results)
sys.exit()
Желаемый вывод после убийства psexec.exe из диспетчера задач:
results:
PsExec v1.90 - Execute processes remotely
Copyright (C) 2001-2007 Mark Russinovich
Sysinternals - www.sysinternals.com
PROD
02/23/2011 09:37 AM 1,610,612,736 pagefile.sys
49 Dir(s) 17,102,487,552 bytes free
The device is not ready.