比如,我调用 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()
|      1zk8802      2020-03-25 17:28:37 +08:00 via iPhone 可以用 subprocess.Popen()。 | 
|      2xiaolinjia      2020-03-25 17:30:19 +08:00 不是 import subprocess subprocess.call('ipconfig') 就可以了么。 | 
|  |      3520Python OP @xiaolinjia  @zk8802 谢谢!这两个我都试过,因为我在整 MongoDB 导入和导出,用到 mongoimport 和 mongoexport,命令里需要带很多参数,参数中有特殊字符,用这两个都报错,特殊字符转 URL 编码值也不好使。但是用 win32process.CreateProcess 执行命令没报错,所以才有现在的问题了,不能获取到输出。 | 
|  |      4mingl0280      2020-03-25 17:55:57 +08:00 via Android CreateProcess 调完后(CreateProcess 有个很长的参数列表,最后一个是 PROCESS_INFO &pInfo)调 WaitForSingleObject(pInfo.hProcess),然后调 GetExitCodeProcess(pInfo.hProcess),wfso 和 gecp 参数你自己查一下 MSDN 。 | 
|  |      5cz5424      2020-03-25 18:31:53 +08:00 via iPhone 直接通过 socket 接口获取信息不好吗?这个绕了一大圈 | 
|  |      6jinsongzhao      2020-03-25 18:42:02 +08:00 via Android 调用的进程通过什么方式返回,就用什么方式取。比如麻烦点的,创建进程时,参数结构体中提供一个标准输出句柄,调用进程通过 print 到标准输出 stdout 。还可以共享内存,可以文件,可以 socket | 
|  |      7xupefei      2020-03-25 18:59:28 +08:00 via iPhone | 
|  |      8hx1997      2020-03-25 19:25:41 +08:00 难道不是……管道吗…… CreateProcess 可以重定向输出的吧 | 
|      9wnpllrzodiac      2020-03-25 20:04:00 +08:00 via Android 管道,获取 ffmpeg 转码进度就是这么玩的。需要的可以祥询 | 
|  |      10loginv2      2020-03-25 20:11:46 +08:00 管道重定向到本程序的标准输出 | 
|  |      11ysc3839      2020-03-25 23:33:58 +08:00 通过管道获取。 不过既然用的是 Python,为什么不使用 Python 自带的跨平台的 subprocess 呢?会简单很多。 | 
|  |      12ysc3839      2020-03-25 23:36:18 +08:00 > 参数中有特殊字符,用这两个都报错 估计你的代码设置了使用 shell 执行吧? shell 需要进行一些转义,尝试不要使用 shell 。 | 
|      13g00001      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); |