PyRun_SimpleString的无穷怨念

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……



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

劳心者、劳力者或CEO、CTO各得其所,足矣

昨天在手机上看到了“清华学生借鉴百度技术自主研发手机框计算”的新闻&#xff0c;又是“计算”&#xff0c;很容易就与“云计算”联系起来了&#xff0c;挺有兴趣了解一下中国百度的“框计算”。毕竟我之前只是知道这么一个名词&#xff0c;没想到这么快就有了研发、应用&…

hdu 1754 I Hate It(线段树)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 45334 Accepted Submission(s): 17789 Problem Description很多学校流行一种比…

java numa_Java只使用2个CPU中的1个和NUMA(Neo4J)

我正在研究一个java程序来创建一个非常大的Neo4J数据库.我使用batchinserter和Executors.newFixedThreadPool来加快速度.我的Win2012R2服务器有2个cpu(26核心26超线程)和256GB NUMA架构.我的问题是,我的导入器只使用1个CPU(节点).是否有可能只使用一个javaprocess的NUMA节点&am…

cisco 交换机vlan-trunk的配置详解及应用实例:

虚拟局域网&#xff08;vlan&#xff09;&#xff1a;主要是为了分割广播域注&#xff1a;不同vlan之间不能相互通信。trunk&#xff1a;主要是为了不同交换机的相同vlan相互通信配置静态VLAN的步骤:************************************1.创建VLAN1)VLAN数据库配置模式:Switc…

java 登录拦截器_springMVC 拦截器-用户登录拦截实战

各位小伙伴咱们继续学习新知识今天要分享的就是拦截器不知道小伙伴们平时上网的时候有没有注意到,尤其是上网购物的时候,不登录账号,就无法访问一些功能页面,比如你不登录账号,就没法查看购物车里面有什么物品.这就是拦截器起到的作用.那么今天我们就来给之前的项目添加一个拦截…

vim匹配特定的行并删除它

From:http://robinfei.blog.sohu.com/111990727.html 删除包含特定字符的行&#xff1a; g/pattern/d 删除不包含指定字符的行&#xff1a; v/pattern/d g!/pattern/d 现实TAB键以及空格等&#xff1a; set list! 删除指定的行&#xff1a; :x,.d #从&#xff58;行…

React开发(171):处理删除与批量删除操作

//处理删除操作handleDelete (id, isBatch) > {if (isBatch && id.length 0) return message.warn(请勾选好友助力);}; 两个参数控制全选和非全选 nice 秒呀

java中异常+连接重置_是什么导致我的java.nett.ocketException:连接重置?

是什么导致我的java.nett.ocketException&#xff1a;连接重置&#xff1f;我们看到了频繁但断断续续的情况。java.net.SocketException: Connection reset我们日志中的错误。我们不确定Connection reset错误实际上来自&#xff0c;以及如何进行调试。这个问题似乎与我们试图发…

ubuntu下查看进程端口

ubuntu下查看进程端口 关键字: linux ubuntu # 查看所有打开的端口及服务名&#xff08;注意这里显示的服务名只是标准端口对应的服务名&#xff0c;可能并不准确&#xff09; nmap localhost # 查看哪些进程打开了指定端口port&#xff08;对于守护进程必须以root用户执行才能…

gzip和gunzip 解压参数

From:http://www.jb51.net/LINUXjishu/11041.html 点评&#xff1a;Linux压缩保留源文件的方法&#xff1a; gzip –c filename > filename.gz Linux解压缩保留源文件的方法&#xff1a; gunzip –c filename.gz > filename gunzip的用法 1.作用 gunzip命令作用是解压文…

React开发(172):React引入背景图片

import React, { Component } from react; import img1 from /assets/1.jpg;

Java游戏聊斋聂小倩_《聊斋倩女幽魂》聂小倩教你赢得战斗

即将由国内最大体感游戏平台——17Vee(亿旗体感)推出的3D单机体感游戏《聊斋之倩女幽魂》因其独特的战斗模式而备受关注。下面&#xff0c;就由《倩女幽魂》的女主角聂小倩来带大家亲身体验一把全新的体感战斗模式。第一步&#xff0c;当然是熟悉体感操作。在第一场战斗前&…

77种互联网盈利创新模式(3)

三&#xff0e;网上销售 11&#xff0e; 电子商务的新贵 《时代》选中亚马逊的CEO贝索斯做风云人物&#xff0c;绝对名副其实。对亚马逊研究越深&#xff0c;越觉得它确实在各方面都具有王者风范。 有1560万种理由认为亚马逊是电子商务之王。这个1560万&#xff0c;正是亚马逊的…

python向服务器请求压缩数据及解压缩数据

向服务器请求压缩数据格式&#xff0c;并解压缩数据 #!/usr/bin/env python # encodingutf-8import urllib2, httplibdef writeFile(fname, data):f open(fname, "w")f.write(data)f.close()if __name__ __main__:httplib.HTTPConnection.debuglevel 1request ur…

LINUX PAM验证机制

一.PAM简介 Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式.换句话说,不用(重新编写和)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制.这种方式下,就算升级本地认证机制,也不用修改程序.PAM使用配置文件/etc/pam.co…

java和node.js 2018_node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况

你知道node.js是怎么火起来的吗&#xff1f;你知道node.js现在的平均工资是多少吗&#xff1f;你知道node.js在2018年还能继续火吗&#xff1f;都不知道&#xff1f;那就来看文章吧&#xff0c;多学点node.js&#xff0c;说不定以后的你工资就会高于nodejs的平均工资了&#xf…

hdu 2110 基础母函数

题意&#xff1a;退出本身并不麻烦&#xff0c;麻烦的是&#xff0c;退出的人需要取走相应比例&#xff08;1/3&#xff09;金额的资产。假设公司此时一共有n种价值的资产&#xff0c;每种价值的资产数量已知&#xff0c;请帮助心烦意乱的XHD夫妇计算一共有多少种分割资产的方法…