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