PyRun_SimpleString的无穷怨念

Python文档 同时被 2 个专栏收录
42 篇文章 0 订阅
55 篇文章 0 订阅

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

话说早上同事喊我帮他改段程序,很简单,就是用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……


                
  • 0
    点赞
  • 5
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

第一卷 生存法则 9 第1章 知己知彼,百战不殆 10 1.1 问题1:这个职业赚钱吗?赚多少钱 10 1.1.1 修炼第一层境界:剑指四方,试问天下谁与争锋 11 1.1.2 修炼第二层境界:世界如此之大,要学的东西很多 11 1.1.3 修炼第三层境界:最深即最浅,最浅即最深,不过如此 12 1.1.4 点评"修炼三层境界" 13 1.1.5 回答这个问题 13 1.2 问题2:大学毕业生找不到职业入口 13 1.2.1 工作经验都是什么经验 14 1.2.2 他们为什么面试的时候这么问? 15 1.2.3 程序员的笔试 20 1.2.4 回答这个问题 23 1.3 问题3:跨行业真的这么难吗? 24 1.3.1 跨行业最难的是什么 24 1.3.2 跨行业的入口--原来从事行业的业务知识 24 1.3.3 农民造出了飞机,为什么他还是农民 25 1.3.4 回答这个问题 25 1.4 秘诀:经营自己的优势 25 1.4.1 善于发掘和积累自己的优势 26 1.4.2 善于展示与利用自己的优势 26 1.5 点评"经营自我" 28 第2章 软件开发职业的误区 28 2.1 误区1:软件开发职业是青春饭 29 2.1.1 不必为30岁以后烦恼 29 2.1.2 30岁以后照样可以编程序 29 2.1.3 50多岁的程序员多的是 30 2.1.4 点评"青春饭" 30 2.2 误区2:做软件开发必须要加班熬夜的工作 30 2.2.1 程序员们熬夜工作的借口 30 2.2.2 常态加班的危害 31 2.2.3 控制好工作的一日时间表才是关键 32 2.2.4 "偏执与狂热"不等于加班加点 33 2.2.5 程序员的大脑与第二大脑 33 2.2.6 点评"加班熬夜" 34 2.3 误区3:开发一个软件产品一定是集团作战 34 2.3.1 几百人的公司其他人都在干什么 35 2.3.2 需要较全的人员配置的项目 38 2.3.3 坚信,只要是"人"做到的我就能做到 38 2.3.4 点评"集团作战" 39 2.4 误区4:程序员不是一般人 39 2.4.1 程序员的与众不同与平凡 39 2.4.2 程序员们就是一般人 41 2.4.3 点评"一般人" 42 2.5 误区5:存在"软件蓝领"岗位 42 2.5.1 "软件蓝领"是个"美梦" 42 2.5.2 "让程序员放弃思考?"是个"噩梦" 43 2.5.3 软件开发流程"理想"的"不理想" 43 2.5.4 "软件蓝领概念"忽略的东西 46 2.5.5 现实中的软件开发团队 48 2.5.6 点评"拧螺丝" 50 2.6 关于误区 50 第3章 程序员的"菜鸟心态综合症" 51 3.1 症状1:指望着公司里有一个老师 51 3.1.1 临床表现 51 3.1.2 治疗1:弄明白她为什么辞职 51 3.1.3 治疗2:理解公司的本质是什么 51 3.1.4 治疗3:要搞清楚你的主管是你的老板,他绝对不是你的老师 52 3.2 症状2:不知道怎么让自己前进 52 3.2.1 临床表现 52 3.2.2 治疗1:你只管低着头上山,暂时不要向山上看 52 3.2.3 治疗2:明知山有虎,偏向虎山行 53 3.2.4 治疗3:没有过不去的火焰山 53 3.2.5 治疗4:虚心使人进步,骄傲自满要不得 54 3.3 症状3:想做圈养的羊,不想做野生的狼 55 3.3.1 临床表现 55 3.3.2 治疗1:理解"丛林法则"生存的法则 56 3.3.3 治疗2:向掠食动物学习如何生存 57 3.4 症状4:缺乏自信,总对自己说 No 57 3.4.1 临床表现 57 3.4.2 治疗1:生活取决于自己 57 3.4.3 治疗2:找到通往高楼的那扇门 58 3.4.4 治疗3:逐个排除你恐惧的理由 58 3.5 症状5:缺少幸福感,内心总在跳跃 59 3.5.1 临床表现 59 3.5.2 治疗1:比一比到底谁最幸福 59 3.5.3 治疗2:要努力进取也要找到幸福的理由 60 3.6 症状6:困兽心态,焦躁与不安 60 3.6.1 临床表现 60 3.6.2 治疗1:像猴子一样生活 60 3.6.3 治疗2:多和团队成员沟通 61 3.7 症状7:缺少感激心,心存感激让你受益匪浅 61 3.7.1 临床表现 61 3.7.2 治疗1:心存感激不等于低人一等 62 3.7.3 治疗2:首先应该对你的领导心存感激 62 3.7.4 真心换真心 63 3.8 症状8:不知道什么是"团队合作" 64 3.8.1 临床表现 64 3.8.2 治疗1:分析在公司上班的三个目标 64 3.8.3 治疗2:团队合作--就是团队主管的目标 65 3.9 点评"心态" 65 第4章 换位思考,项目主管的招聘技巧 66 4.1 招聘就像大海捞针 66 4.2 技巧1:是否有独立完成项目的经验 66 4.2.1 独立完成一个项目的经验是什么经验 67 4.2.2 没有独立生存的能力不能有最佳团队合作 68 4.2.3 测试手段 69 4.2.4 锻炼攻略:需要主动寻找独立工作的机会 71 4.3 技巧2:是否有独立解决问题的能力 72 4.3.1 见招拆招的能力 72 4.3.2 程序员的韧性 72 4.3.3 测试手段 72 4.3.4 锻炼攻略:训练创意思维 74 4.4 技巧3:评价程序员的思考方式 74 4.4.1 一切皆程序 75 4.4.2 找到规律 76 4.4.3 锻炼攻略:抓住中心把复杂的事情变简单 77 4.5 点评"换位思考" 79 第5章 程序员,保持你前进的步伐 80 5.1 程序员前进的四个阶段 80 5.1.1 第一阶段,找到一个编程语言去入门 80 5.1.2 第二阶段,用所这门语言去分析和推理 80 5.1.3 第三个阶段,新知识新技术的积累 81 5.1.4 第四个阶段,大道无形 81 5.2 学习与积累 81 5.2.1 找到好书,相当于找到一个好老师 82 5.2.2 每本书都没有从头看到尾是不是等于不用功? 84 5.2.3 学会建立沉淀目录 86 第二卷 制胜法宝 88 第6章 Java 程序员的七种武器 89 6.1 武器1:编程 IDE 开发工具 89 6.1.1 Team Leader 的嗜好 89 6.1.2 什么功能是程序员最需要的 89 6.1.3 下面这些 IDE 你都用得到 93 6.1.4 点评"开发工具" 98 6.2 武器2:数据库系统 98 6.2.1 广告与市场的力量 98 6.2.2 不要盲目选择数据库,根据用途选择合适的数据库 99 6.2.3 以下这些数据库绝不能仅仅是"眼熟" 100 6.2.4 研究一下 JDBC 源程序 102 6.2.5 不熟悉数据库就会"绕远" 113 6.2.6 点评"真相" 117 6.3 武器3:Web 服务器软件 118 6.3.1 Web 服务器是如何工作的 118 6.3.2 支持 JSP 的 Web 服务器的原理 119 6.3.3 常用的 WebServer 120 6.3.4 研究一下 Web Server 的源程序 120 6.3.5 点评"深入研究" 124 6.4 武器4:操作系统 125 6.4.1 让我们看看这个招聘启事 125 6.4.2 Java 程序员为什么需要研究操作系统 125 6.4.3 我们应该更关心操作系统的哪些方面 125 6.4.4 哪些操作系统我们要重点关注 126 6.4.5 点评"Linux" 131 6.5 武器5:编程语言 132 6.5.1 Java 程序员只会 Java 语言行吗 132 6.5.2 各个编程语言的特长 134 6.5.3 点评"第二门语言" 136 6.6 武器6:辅助设计工具 136 6.6.1 UML 图设计工具 136 6.6.2 常用 UML 设计工具 137 6.6.3 UML 要"灵活"的掌握 140 6.7 武器7:版本控制工具 140 6.7.1 工作原理 140 6.7.2 常用版本控制工具 140 6.7.3 融入团队的开发氛围 141 6.8 点评"武器" 141 在此只列出前6章的,后面还有很多,需要的赶快来下哈。特别对大学生有用!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值