Python Popen 挂起与 psexec - 不希望的结果

标签 python subprocess pipe py2exe psexec

我对 subprocess.Popen 和我认为是管道的问题有疑问。我有以下代码块,从 cli 运行时 100% 的时间都没有问题:

    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 not liking undefined stdin, out, or err in subprocess。然后我修改了我的代码如下:

    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.

最佳答案

[这应该是评论,但我没有代表发表评论]

我听说 subprocess.PIPE 有很多问题。尝试使 stdin、stdout 和 stderr 都指向临时文件。然后你可以使用 p.wait() 而不是 communicate()。这似乎工作正常吗?

关于Python Popen 挂起与 psexec - 不希望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194713/

相关文章:

python - Python 中的结构和解包

python - 在 subprocess.call 中使用大于运算符

python - 如何从 Windows 上的 Gstreamer 子进程读取二进制数据?

python - python 管道的同步/异步行为

python - 当通过参数传递参数时调用Python中的子进程

linux - grep -v '.*' 不起作用

python - 类型错误 : 'tuple' object does not support item assignment when swapping values

python - Python 中检查句子是否回文的更好方法

python - 如何在python中拆分字符串

python - 在 Django 中,如何调用启动时间较慢的子进程