在C++应用程序中嵌入Python解释器时,调用官方提供的接口“PyRun_SimpleString”只能获取到脚本执行是否成功,而无法获取标准输出和标准出错,之前曾尝试过使用将重定向到文件的方式,但效果并不理想,在调用Pywinauto时,出现了文件访问异常,代码及异常如下所示:

PyRun_SimpleString("import sys\nfile = open('out.txt','w')\nsys.stdout = file\nsys.stderr = file");

......
 PyRun_SimpleString("file.close()");

在解决该问题的过程中,发现Python解释器执行Py脚本的标准输出和标准出错会打印在控制台上,为此尝试在C++应用程序中将标准输出重定向到文件中,经过测试发现,cout/printf可以重定向到文件中,但执行python脚本时,则会发生异常,源码及异常如下所示:

FILE* stream;
freopen_s(&stream, "file.txt", "w", stdout);

为解决重定向的问题,通过查阅官方资料,反复测试调试,终于找到了新的解决方案,依然使用重定向的方式,但不再重定向到文件中,而是重定向内存中,使用PyObject_GetAttrString获取,代码如下:

#include <iostream>
#include "Python.h"

int main()
{
    std::cout << "Hello World!\n";
    std::string stdOutErr =
        "import sys\n\
class CatchOutErr:\n\
    def __init__(self):\n\
        self.value = ''\n\
    def write(self, txt):\n\
        self.value += txt\n\
catchOutErr = CatchOutErr()\n\
sys.stdout = catchOutErr\n\
sys.stderr = catchOutErr\n\
"; //this is python code to redirect stdouts/stderr

Py_Initialize();
    PyObject* pModule = PyImport_AddModule("__main__"); //create main module
    PyRun_SimpleString(stdOutErr.c_str()); //invoke code to redirect
    PyRun_SimpleString("from pywinauto import application"); //this is ok stdout
    PyRun_SimpleString("app = application.Application()"); //this is ok stdout
    PyRun_SimpleString("app.start(\"C:\\Program Files\\yjkSoft\\YJKS_3_1\\yjks.exe\")"); //this is ok stdout
    PyRun_SimpleString("1+a"); //this creates an error
    PyObject* catcher = PyObject_GetAttrString(pModule, "catchOutErr"); //get our catchOutErr created above
    PyErr_Print(); //make python print any errors
    PyObject* output = PyObject_GetAttrString(catcher, "value"); //get the stdout and stderr from our catchOutErr object
    printf("Here's the output:\n %s", _PyUnicode_AsString(output)); //it's not in our C++ portion
    Py_Finalize();
}

Python标准输出重定向相关推荐

  1. php标准输出重定向,python标准输出重定向方式

    一. 背景 在Python中,文件对象sys.stdin.sys.stdout和sys.stderr分别对应解释器的标准输入.标准输出和标准出错流.在程序启动时,这些对象的初值由sys.__stdin ...

  2. python输入输出重定向_Python标准输出重定向

    Python标准输出重定向 标签: Python stdout 重定向 声明 本文基于Python2.7版本,介绍常见的几种标准输出(stdout)重定向方式.显然,这些方式也适用于标准错误重定向. ...

  3. python输出重定向到窗口_[python]重定向输出

    本文作者:riag 本文出处:http://blog.csdn.net/riag 声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息 ...

  4. 深入理解虚拟机实战:修改class文件实现System标准输出重定向

    一.背景 在深入理解Java虚拟机的过程中,理解java程序在虚拟机层次如何执行十分重要.了解了深层次的东西,才可以实现一般情况下做不到的特殊功能,而这种特殊功能面向的对象往往是程序员本身.下面我们通 ...

  5. linux标准输出重定向到文件夹,linux输入输出重定向使用详解

    1. 输出重定向: 默认条件下,标准输出和错误输出都是终端,可以把标准输出和错误内容进行重定向: [~]# echo "hello\!" hello\! [~]# echo &qu ...

  6. python输出重定向记录

    使用python -u让输出实时打印到屏幕,不经过缓存: 使用| tee将输出重定向到文件,但不同于一般的重定向,这样做在标准输出同样显示.

  7. python requests 重定向_认识Python最最最常用语重要的库Requests

    Requests库是Python爬虫中最最最最最最重要与常见的库,一定要熟练掌握它.下面我们来认识这个库 Requests requests是Python最为常用的http请求库,也是极其简单的.使用 ...

  8. python 如何重定向输出

    在Windows和Linux终端中,可以用>和>>符号将程序输出重定向到文件中,那么在程序内部是否也可以执行相应操作呢? Python使用三个IO文件流来管理标准输入.输出和错误输出 ...

  9. python获取重定向url_python中检测url重定向到的地址的例子

    2016年最长的假期也过了,这周连上7天班,之前还觉得挺恐怖,没想到这周真是要忙死的节凑,还真没觉得多漫长,一晃明天就周五了,干运维的就是突发的事情多,冷不丁的不知道哪里就冒出个问题,就够搞半天的,最 ...

最新文章

  1. P3321 [SDOI2015]序列统计
  2. 一致性哈希算法----- 解决memecache 服务器扩容后的数据丢失。
  3. Java集合篇:fail-fast机制 与 fail-safe
  4. handle search in myNote app
  5. python存数据到excel_python爬取的数据--保存数据到excel
  6. Ubuntu热键控制spotify播放和音量调节
  7. 使用NPOI导入导出标准Excel(源码)
  8. 如果计算机原理程序设计,计算机组成原理程序设计.doc
  9. 淘淘商城系列(一)—— 淘淘商城介绍(二)
  10. softmgr主程序_SoftMgrBase.dll
  11. 怎么换证件照底色?分享两款好用的免费制作证件照的软件
  12. python化学公式配平_PYTHON趣用—配平化学方程式-阿里云开发者社区
  13. Android 开发百度地图定位显示当前位置
  14. AcWing每日一题 1934贝茜放慢脚步
  15. PMBOK 项目管理 九大知识领域和五大流程
  16. CVPR2022知识蒸馏用于目标检测:Focal and Global Knowledge Distillation for Detectors
  17. Python之qq自动发消息
  18. stm32-mini-LCD液晶显示实验
  19. 小程序下拉刷新没有三个小圆点的加载动画
  20. STK中心天体cb等相关文件说明

热门文章

  1. Android 进程间通信之管道 - pipe
  2. Vue:beforeDestroy和destroyed生命周期函数的特点
  3. vim编辑器移动多行(多行tab)
  4. Android设备上部署Pytorch,实现性别识别,男女分类
  5. mysql 当前日期后七天
  6. Python 爬虫案例(二)--附件下载
  7. 用Python写简单游戏的一般步骤
  8. java高级工程师笔试题含答案_java高级工程师笔试题
  9. Java位运算符以及运算优先级
  10. 浅谈Python中的类型转换