首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
520Python
V2EX  ›  Python

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

  •  
  •   520Python · 7 天前 · 1056 次点击

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

    import win;
    import process.popen;

    var ipconfig = process.popen("ipconfig","/all");
    var str = ipconfig.read(-1);
    win.msgbox(str);
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2434 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:19 · PVG 00:19 · LAX 09:19 · JFK 12:19
    ♥ Do have faith in what you're doing.