From: http://blog.csdn.net/ccat/article/details/544491

好吧,我承认我是个菜鸟,所以今天我勇敢的站出来接受大家的鄙视……

话说早上同事喊我帮他改段程序,很简单,就是用PyRun_SimpleString函数执行一段Python脚本。错误也很直接,执行的时候出现写地址错误,如果你经常用VC/Delphi写一些用指针转来转去的程序,就应该经常见到这样的错误。

所以,当时我很镇定。

嗯,我镇定自若的指着屏幕(你看,那个时候这只手还很干燥)。呐,是不是文件访问权限设得太高了?

同事答曰,我已经试过所有的组合了。一边说一边给我看MSDN上的fopen函数说明。

那么……嗯,今天天气真好啊……(严肃点,我这儿思考问题呢)……那么,我们试试看……

在一番瞎折腾过后,我的直觉告诉我,这个不应该是我同事的编码有问题,大概是项目的什么配置或者干脆就是Python给出的API有问题。在看了同事从若干搜索引擎上找到的无数文章后,更确信这一点。于是我回到自己的座位上,打开Google,也开始搜索。

不找不知道,Python的资料这叫个乱噢……即使是英文文档,也充满了荒唐可笑的错误。有位达人还发表了这样一段代码:

#include "Python.h"

int  main()
  {
    Py_Initialize();
    PyRun_SimpleFile("<filename>");
    Py_Finalize();
    return();
  }

呃……我的英文很差,也许我误解了人家的意思,他其实是贴了份伪码?反正这份代码绝对是匪夷所思的。连PyRun_SimpleFile的参数表都对不上。本来就短到没几个字的文章,再配上这么“简洁”的代码,实在就没什么营养了。

上面这个例子,只是我今天搜到的无数无用信息之一,在令我哭笑不得的混乱中,鬼知道哪个是有用的。唯一能确定的是,遇到这个问题的人还真挺多的……有人说这是个MSVC的使用问题,而不该当作Python问题(嗯,提这个问题的都是用VC的,看来有道理);有人说这是因为-MD编译选项没打开,打开它就好了,于是我就在IDE中设置C++编译器命令行,加上-MD,但是问题依旧(嗯,当时我还在想,这个-MD是什么意思?难道编译器也用汉语拼音讲粗口?);还有人说,这个是因为vc运行时库方面,Python解释器和开发者使用的不统一,所以出错,根治的方法只有重编译整个Python。啥也不说,我看了这个头都大了。

读过几十篇不知道是不是恶搞的文章后,我的恶趣味上来了,在编译了Python内核的Debug版后,我开始了内核跟踪之旅。令人绝望的是,出错的地方在内核非常非常深入的地方,类似PyRun_ParseFile 之类的函数,也就是说,如果真的是源码有问题,那么整个Python就应该根本不能在Windows上正常运行。这显然与我们所见的事实相违背。事实上,我真的把Python源码中执行脚本的那段复制出来,仍然不能使用。此时已经是晚上,我的思路又回到了项目的设置,一样的源代码,Python项目编译出来正常,我调用就有错,这个很难说得通。于是我在项目设置中漫无目的的巡视着……

这这这,这是什么?

Embeding By PyRun_SimpleFile

这不就是哪个什么什么粗口编译选项么?在把项目选项页中的“C/C++”·“运行时库”选项设置为多线程DLL(/MD)——调试状态下为“多线程调试DLL(/MDd)”后,一切正常了!

呃,严肃点说,Python的Windows版都是以/MD,也就是多线程DLL模式编译的,如果嵌入调用PyRun_SimpleFile,或者其它以解释器执行文件的API,都应该把项目编译成这个模式,不然就会发生内存访问错误。

呃……我的英文很差,也许我误解了人家的意思,他其实是贴了份伪码?反正这份代码绝对是匪夷所思的。连PyRun_SimpleFile的参数表都对不上。本来就短到没几个字的文章,再配上这么“简洁”的代码,实在就没什么营养了。

上面这个例子,只是我今天搜到的无数无用信息之一,在令我哭笑不得的混乱中,鬼知道哪个是有用的。唯一能确定的是,遇到这个问题的人还真挺多的……有人说这是个MSVC的使用问题,而不该当作Python问题(嗯,提这个问题的都是用VC的,看来有道理);有人说这是因为-MD编译选项没打开,打开它就好了,于是我就在IDE中设置C++编译器命令行,加上-MD,但是问题依旧(嗯,当时我还在想,这个-MD是什么意思?难道编译器也用汉语拼音讲粗口?);还有人说,这个是因为vc运行时库方面,Python解释器和开发者使用的不统一,所以出错,根治的方法只有重编译整个Python。啥也不说,我看了这个头都大了。

读过几十篇不知道是不是恶搞的文章后,我的恶趣味上来了,在编译了Python内核的Debug版后,我开始了内核跟踪之旅。令人绝望的是,出错的地方在内核非常非常深入的地方,类似PyRun_ParseFile 之类的函数,也就是说,如果真的是源码有问题,那么整个Python就应该根本不能在Windows上正常运行。这显然与我们所见的事实相违背。事实上,我真的把Python源码中执行脚本的那段复制出来,仍然不能使用。此时已经是晚上,我的思路又回到了项目的设置,一样的源代码,Python项目编译出来正常,我调用就有错,这个很难说得通。于是我在项目设置中漫无目的的巡视着……

这这这,这是什么?

Embeding By PyRun_SimpleFile

这不就是哪个什么什么粗口编译选项么?在把项目选项页中的“C/C++”·“运行时库”选项设置为多线程DLL(/MD)——调试状态下为“多线程调试DLL(/MDd)”后,一切正常了!

呃,严肃点说,Python的Windows版都是以/MD,也就是多线程DLL模式编译的,如果嵌入调用PyRun_SimpleFile,或者其它以解释器执行文件的API,都应该把项目编译成这个模式,不然就会发生内存访问错误。

最后,我要说的是,用PyRunSimpleFile函数调用Python脚本,真的很简单,甚至可以简单到如下这样:

#include"python.h"int main(int argc, char *argv[])
{Py_Initialize();FILE * fp = NULL;fp = fopen("test.py", "r");if (fp == NULL) 
        {return 1;}PyRun_SimpleFile(fp, "test.py");Py_Finalize();return 0;
}

我们不需要include系统I/O库,Python.h中已经封装了这些东西,也不需要fclose,PyRun_SimpleFile已经做了这一步,相信我,我在源代码中看到了它。

写下这篇文章,其实是想纪念下今天这个令我抓狂的遭遇,以及它戏剧性的收场,另外也感慨自己对日常使用的编译器太不了解……现在总算知道-MD是什么意思,在哪里设置了,MD……

PyRun_SimpleString的无穷怨念相关推荐

  1. PyRun_SimpleFile()崩溃问题

    From: http://blog.csdn.net/jq0123/article/details/1504406 PyRun_SimpleFile()造成程序崩溃. 例程如下: #include & ...

  2. python计算无穷级数求和常用公式_无穷级数-从入门到火葬

    一篇自学级数的笔记,带你轻松入门. 级数是什么:级数理论是分析学的一个分支:它与另一个分支微积分学一起作为基础知识和工具出现在其余各分支中.二者共同以极限为基本工具,分别从离散与连续两个方面,结合起来 ...

  3. 邻接矩阵中啥时候写0和无穷_集合中的上极限与下极限

    这次总结一个数学中经常出现的概念:集合中的上极限与下极限,并举一个简单的例子进行说明,接着再对于概率论中的Borel-Cantelli引理做一个简单介绍. 1. 定义 对于一个集合序列 ,我们定义它的 ...

  4. SAP MIGO 发货批次确定界面批次可用数量无穷大问题之对策

    SAP MIGO 发货批次确定界面批次可用数量无穷大问题之对策 本周收到业务的一个问题,MIGO投料的时候批次确定功能建议的数量不准确.在批次确定界面里,每个批次的可用数量都是无穷大,如下图示: 由于 ...

  5. 数学史上的哲学绝唱——无穷观与数学基础的争论

    来源:<广西民族大学学报>2014年11月 作者:郭龙先,黄永 两千多年来,数学家们一直试图从少数公理出发,根据明确给出的演绎规则推导出其他数学定理,从而把整个数学构造成为一个严密的演绎大 ...

  6. 无穷级数求和7个公式_考研数学闭关修炼习题讲解(16)无穷级数 附(6)补充解释

    假期鸽了很久,今天我要分享的是无穷级数,数一的专场. 今天的内容一共有9题,一起加油吧! [1] 本题考查无穷级数的判敛.本题用到的是通过放缩(比较判别法)直接判断敛散性,属于简单题,把后面的sin放 ...

  7. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数最大值 | 自相关函数最大值 | 互相关函数最大值 | 能量有限信号的相关函数在 m 趋近无穷时为 0 )

    文章目录 一.相关函数最大值 1.自相关函数最大值 2.互相关函数最大值 二.能量有限信号的相关函数在 m 趋近无穷时为 0 一.相关函数最大值 1.自相关函数最大值 自相关函数 在 自变量 m=0m ...

  8. matlab 1到无穷_Matlab的实用技巧(一)

    Matlab的全称为:Matrix Laboratory, 即矩阵实验室.它的特点是:适合矩阵运算, 适合矩阵运算 ,适合矩阵运算.举例而言:要计算 矩阵 n 阶矩阵 M与N的乘积,matlab只需要 ...

  9. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第7章-Lurie 型动态网络的鲁棒 H 无穷簇同步

    第6章 回到目录 第8章 第7章-Lurie 型动态网络的鲁棒 H 无穷簇同步 7.1 引言 7.2 问题描述 7.3 主要结果 7.3.1 无时滞 Lurie 型子系统 7.3.2 时滞 Lurie ...

最新文章

  1. 想成为优秀的技术人员你必须做到的几件事情
  2. Windows Server 2016软件定义存储:Storage Spaces Direct介绍
  3. 前端技巧|Chrome上4款超级实用的插件!
  4. 〖Python〗-- Django内置Admin
  5. Python中的高级数据结构
  6. 安卓APP_ 其他(1) —— 程序的签名打包并在手机上运行
  7. [css] 为什么要使用sass/less?
  8. 利用SQL移动硬盘文件(转于zjcxc)
  9. window对象(一) 计时器 定位导航 url解析 浏览历史 对话框 消息推送
  10. oracle11g 查看表,oracle11g查看,添加表空间
  11. CentOS 安装WildFly Jboss10
  12. c# 从sql 数据库生成 excel (转)
  13. SSH 协议端口号 22 背后的故事
  14. vc12对应的php版本,vc和vs的区别
  15. 如何理性的从经济学角度看待“互联网寒冬”?
  16. 康师傅被“水和面”糊住了眼睛?
  17. 教你如何在Windows XP使用定时关机命令
  18. 有备无患!DBS高性价比方案助力富途证券备份上云
  19. PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning 翻译
  20. 开涛的博客 spring

热门文章

  1. 读古诗系列--(两首)题都城南庄/江楼感旧
  2. python初学者_面向初学者的20种重要的Python技巧
  3. sqlserver垮库查询_Oracle和SQLServer中实现跨库查询
  4. 1736. 替换隐藏数字得到的最晚时间
  5. linux tar cvf_Linux中的Tar命令:Tar CVF和Tar XVF通过示例命令进行了解释
  6. Diffie-Hellman:安全网络通信背后的天才算法
  7. 初学者设计数据库_面向初学者的完整数据库设计课程
  8. 印刷点阵字体_印刷术如何确定可读性:衬线与无衬线,以及如何组合字体。
  9. freeCodeCamp纳什维尔十月聚会回顾
  10. 马尔科夫链蒙特卡洛_蒙特卡洛·马可夫链