V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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 · Mar 25, 2020 · 3921 views
    This topic created in 2223 days ago, the information mentioned may be changed or developed.

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

    import win;
    import process.popen;

    var ipconfig = process.popen("ipconfig","/all");
    var str = ipconfig.read(-1);
    win.msgbox(str);
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   853 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 21:50 · PVG 05:50 · LAX 14:50 · JFK 17:50
    ♥ Do have faith in what you're doing.