比如,我调用 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); |