Python Popen pendurado com psexec - resultados indesejados
Estou tendo um problema com o subprocess.Popen e o que eu acredito ser pipe. Eu tenho o seguinte bloco de código que funciona sem emitir 100% do tempo ao executar a partir do 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()
Resultado:
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
Eu tinha esse programa completo, mas uma vez que o compilava com py2exe, ele simplesmente travava ou travava. Eu rastreei esse problema até py2exe, não gostando de stdin, out ou err errado no subprocesso. Modifiquei meu código da seguinte maneira:
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()
Esse código também funciona 100% do tempo, mas quando imprimo resultados, ele mostra apenas as mensagens psexec padrão, não a saída dos comandos executados.
Resultado:
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.
Tentei combater isso adicionando shell = true às opções do subprocesso, mas quando faço isso, o programa trava 99% do tempo. Na verdade, ele será executado 1% do tempo. Notei que, enquanto o programa está paralisado, se eu entrar no gerenciador de tarefas e matar manualmente o processo psexec, a saída desejada será mostrada. Isso está me deixando louco e eu tenho procurado para sempre sem encontrar nada. O código está sendo executado no WinXP python v2.7. Entre em contato se tiver alguma dúvida ou precisar de informações adicionais.
Código de suspensão:
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()
Saída desejada após matar o psexec.exe no gerenciador de tarefas:
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.