Python Popen висит с psexec - нежелательные результаты - PullRequest
3 голосов
/ 04 марта 2011

У меня проблема с подпроцессом. Откройте и, как я полагаю, каналы.У меня есть следующий блок кода, который работает без проблем 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.

Ответы [ 3 ]

0 голосов
/ 09 марта 2011

попробуйте запустить psexec с -i у меня это работает

p = subprocess.Popen("psexec " "-i "  . . . 
0 голосов
/ 06 сентября 2011

Я однажды видел эту проблему:

  1. Перенаправление трафика на временные файлы кажется рабочим решением - проблема в дополнительном коде, необходимом для доступа к выходным данным процесса, - но это стабильное решение,Проблема заключается в дополнительном коде, необходимом для доступа к выходным данным процесса (если вы хотите отобразить его во время работы - если нет, это просто дамп файла)
  2. Вы также можете проверить local * фабрики реализации - я не запускал psexec с ним, но все остальные процессы работали нормально (за исключением того факта, что он не обеспечивает механизм тайм-аута)
0 голосов
/ 07 марта 2011

[Это должен быть комментарий, но у меня нет представителя, чтобы оставлять комментарии]

Я слышал о множестве проблем с подпроцессом. ТРУБА.Попробуйте сделать так, чтобы stdin, stdout и stderr указывали на временные файлы.Тогда вы можете использовать p.wait () вместо общения ().Кажется ли это работает правильно?

...