大神前来:win32process.CreateProcess 调用 Windows 里面的 exe 文件执行后,如何获取 exe 执行的返回结果呢?

2020-03-25 17:27:16 +08:00
 520Python

比如,我调用 cmd.exe 来执行“ipconfig”命令,如何才能获取到返回呢?

例如:

import win32process
def main():
    exePath = "cmd.exe"
    param = "ipconfig"
    param = exePath + " " + param
    handle = win32process.CreateProcess(exePath,
                                    param,
                                    None,
                                    None,
                                    0,
                                    win32process.CREATE_NEW_CONSOLE,
                                    None,
                                    None,
                                    win32process.STARTUPINFO())
    '''
    此处如何获取 handle 的返回结果?:
    D:\>ipconfig
        Windows IP 配置
        以太网适配器 本地连接:
           连接特定的 DNS 后缀 . . . . . . . :
           本地链接 IPv6 地址. . . . . . . . : fe80::8...%11
           IPv4 地址 . . . . . . . . . . . . : 192....1.3
           子网掩码  . . . . . . . . . . . . : 255.2...5.0
           默认网关. . . . . . . . . . . . . : fe80...11
                                               19....1
    '''
if '__main__' == __name__:
    main()
3145 次点击
所在节点    Python
13 条回复
zk8802
2020-03-25 17:28:37 +08:00
可以用 subprocess.Popen()。
xiaolinjia
2020-03-25 17:30:19 +08:00
不是
import subprocess
subprocess.call('ipconfig')
就可以了么。
520Python
2020-03-25 17:36:21 +08:00
@xiaolinjia
@zk8802
谢谢!这两个我都试过,因为我在整 MongoDB 导入和导出,用到 mongoimport 和 mongoexport,命令里需要带很多参数,参数中有特殊字符,用这两个都报错,特殊字符转 URL 编码值也不好使。但是用 win32process.CreateProcess 执行命令没报错,所以才有现在的问题了,不能获取到输出。
mingl0280
2020-03-25 17:55:57 +08:00
CreateProcess 调完后(CreateProcess 有个很长的参数列表,最后一个是 PROCESS_INFO &pInfo)调 WaitForSingleObject(pInfo.hProcess),然后调 GetExitCodeProcess(pInfo.hProcess),wfso 和 gecp 参数你自己查一下 MSDN 。
cz5424
2020-03-25 18:31:53 +08:00
直接通过 socket 接口获取信息不好吗?这个绕了一大圈
jinsongzhao
2020-03-25 18:42:02 +08:00
调用的进程通过什么方式返回,就用什么方式取。比如麻烦点的,创建进程时,参数结构体中提供一个标准输出句柄,调用进程通过 print 到标准输出 stdout 。还可以共享内存,可以文件,可以 socket
xupefei
2020-03-25 18:59:28 +08:00
hx1997
2020-03-25 19:25:41 +08:00
难道不是……管道吗…… CreateProcess 可以重定向输出的吧
wnpllrzodiac
2020-03-25 20:04:00 +08:00
管道,获取 ffmpeg 转码进度就是这么玩的。需要的可以祥询
loginv2
2020-03-25 20:11:46 +08:00
管道重定向到本程序的标准输出
ysc3839
2020-03-25 23:33:58 +08:00
通过管道获取。
不过既然用的是 Python,为什么不使用 Python 自带的跨平台的 subprocess 呢?会简单很多。
ysc3839
2020-03-25 23:36:18 +08:00
> 参数中有特殊字符,用这两个都报错
估计你的代码设置了使用 shell 执行吧? shell 需要进行一些转义,尝试不要使用 shell 。
g00001
2020-03-26 14:31:07 +08:00
Python 跨平台有时候还是会有些负担,
Windows 上用 aardio 搞这些东西就很容易,转义都自动处理,管道读写也简单。

import win;
import process.popen;

var ipconfig = process.popen("ipconfig","/all");
var str = ipconfig.read(-1);
win.msgbox(str);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/656123

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX