Category Archives: Python

字节序问题

今天使用Python来读取二进制文件。直接使用read读取,读入的内容没有错误,长度也是对的,使用了type函数查看了一下内存中的数据类型,发现是str的,初步认为是采用C语言里面的char方式存储。 不过我是要把读入的内容转为内存中的数据结构,需要处理整型等数据类型。由于自己认为是char方式存储的,就直观的认为只要将4个字节的char使用int()函数强制转换一下就没有问题的,不过转换失败。后来咨询了木头,说是要使用struct来处理。查手册,发现struct狠简单,常用的函数就是pack和unpcak。使用unpack函数试试,先google一下,网上面有没有相关的例子代码,发现一个: print struct.unpack(‘>I’,recv_data[recv_len-6:recv_len-2])[0] 然后就照猫画虎写了一个(“%s”)%struct.unpack(“>I”, buff[462:466])不过测试结果却出乎我的意料,读出来的数据不对。同时对>号感到奇怪,查手册struct的下半部分,发现>是表示网络字节序方式,而不是我们x86系列的本地字节序,删除>试试,读出来的结果正确。 以前只是在写网络程序的时候要注意网络字节序问题,现在突然发现,python里面也要考虑字节序,看来python的处理考虑的还是狠周到的。不过以后也要注意二进制的字节序问题了,毕竟网络过来的二进制数据会越来越多的,很多程序中应该考虑这个问题。

Posted in Python | Leave a comment

Python的数据结构还是狠不错的

现在写的程序中,一直都在集成Python,所以对Python的数据结构比较熟悉了。今天使用STL来写一个不带Python的程序,发现STL的结构虽然轻巧,但是感觉Python的数据结构操作起来更是方便。可能是跟这几天一直在用Python的数据结构有关吧。 其实最关键的地方是文本文件的处理,使用Python脚本把文本读进来,处理,然后直接存为Python的数据结构方式,比使用C++读入文本再使用STL方式来保存方便很多。不过Python的数据结构至少需要带一个DLL文件,这对于小程序是一个累赘啊。

Posted in BCB||C++, Python | 1 Comment

Python嵌入程序的调试

最近的这个项目,是利用Python操作文本的方便和快捷性,嵌入到项目中处理文本文件。目前做的就是将Python解释器集成到程序里面,然后附带一个Python24.dll,不过这样好像还是差一个文件的,msvcr71.dll,开始测试的时候,由于机器里面装有Python24,没有测试出来,到客户那里演示的时候,才发现没有这个文件,幸亏带了Python的安装包,要不然就出丑了。 由于昨天对脚本进行了一些改动,改动的结果感觉差不多,就没有测试直接给演示了,导致演示中出现了一个小问题,改动部分的脚本执行有问题,程序调用返回始终是NULL。开始以为是脚本调用错了,后来以为是缓存的问题,总之排除了很多外在的因素后,最后认为Python的脚本有问题。最后查得得结果是处理传出来的数据结构中,脚本处理有问题,导致单独执行的时候没错(因为测试用的数据结构没有和传出来的匹配),但是集成处理有问题。 开始的时候,就是准备将Python执行的日志集成进去,不过由于偷懒,只做了程序的,没有做脚本的。认为脚本在本地执行了,程序再去执行是应该没有问题的,现在发现还有有些不同,需要处理的。看来把Python的执行日志集成进去是必要的,否则临时修改脚本,出错了就不好找问题所在了。

Posted in Python | 2 Comments

水平有待加强

现在终于可以开始全心的投入到Python的嵌入开发中了。不过由于好长时间没有接触到Python这块,使得原先掌握的嵌入式Python的知识忘记了不少,现在很多时候还是需要重新去温习一遍。从网上查到的资料,搞Python的嵌入式开发还是比较少的,基本都是作为一种开发的辅助来进行。我现在的参考资料只有Python自己手册里面带的C API部分。不过自己的英语水平不行,很多地方看得不是狠明白,主要是阅读速度太慢了,不过幸亏有代码可以试,这样开发起来感觉难度是不算大的。不过刚开始的时候,可能内存处理没怎么注意,不过幸亏是客户端,实在不行可以重启一下机器,不怕:)不过随着开发的进入,这些东西必须注意起来,因为这些东西如果处理不好的话,会影响软件的稳定性,不过在软件的第一个版本中,还是功能要优先实现的。 今天写了一个C++的代码,居然用上了Python的语法,非常郁闷:)就是将字符串转为Python对象的时候,我弱智到了直接使用PyObject *进行强制转换了,实际上应该是使用PyString_FromString进行的,导致调试的时候老是非法操作。感觉还是基本功不扎实,需要加强。

Posted in Python | Leave a comment

Embedding Python Tips

转自:http://stompstompstomp.com/weblog/entries/72/ 这是我在查找嵌入Python文章的时候发现的,主要是讲述一些Python嵌入的Tips。

Posted in Python | Leave a comment

发点牢骚

这一个月来,由于自己的一些问题,一直没有碰Python代码,今天看到别人写了一个比较有意思的类,我准备用Python代码改一下。由于手头没有合适的编辑器,直接拿记事本来着,但是写到一半的时候,突然发现自己对Python代码已经有点陌生了,对照着别人现成的类改,一口气居然没法改下来。看来,熟能生巧这个成语还是有一定的道理的。不过等这段事情过了之后,得好好的回到Python继续研究了,不过主要还是侧重嵌入式研究,感觉这个玩意还是比较好玩的。 这几天的代码里面,涉及到了一些字符串操作,自己就老是想使用Python来进行,可惜目前的项目不允许这样做,主要是自己的Python嵌入还没有搞的顺畅。不过以后可以考虑加入,毕竟简单的应用只是多了一个DLL的问题,但是带来开发上的方便是无法想象的:)

Posted in Python | Leave a comment

wxMozilla

地址:http://wxmozilla.sourceforge.net/ wxMozilla is a project to develop a wxWindows component for embedding the Mozilla browser into any wxWindows application. The wxMozilla classes use Mozilla’s XPCOM (Cross Platrom COM) interface to embed a HTML browser or editor within the application. 一直以为,如果自己的程序想嵌入网页,而且兼容性要好一点,就只能使用IE,但是今天突然发现这个家伙,呵呵,看来嵌入firefox也是有希望的啊.

Posted in Python, Web应用 | 1 Comment

数据库的选择

开始的时候,准备在自己的客户端系统中完全放弃数据库,改用内存和XML实现,这样操作起来简单,可移植性也高。但是到目前,发现一个问题,就是数据库编辑后保存没有想想中的简单。虽然可以做到,但是代码量却是直线上升。看来不引入数据库是不行了。 开始的时候考虑使用access,不过根据以前的经验,这个玩意太不可靠了,对开发人员要求很高,数据库操作稍微不小心,就会给你报错。想想还是放弃吧,以后给工程人员维护,估计数据库会。考虑使用客户端可以嵌入的数据库系统,这样在客户端可以一次安装。所以MSDE之类的已经不在考虑之列了。最后在mysql,sqlite,firebird之间选择(发现一个开源数据库比较的网页:http://www.csdn.net/news/newstopic/4/4986.shtml),由于客户端使用了BCB工具进行开发,而且前段时间好像也有人提到Python链接FB的问题,估计这两个支持是没有问题的了。这样可以使用BCB的快速的GUI开发功能,也可使用Python的脚本功能。 不过目前使用FB遇到的一个问题是,没有一个GUI界面的可以操作FB数据库的工具,可能是我没有找到。暂时还不了解Python对FB支持的程度,还得找找资料,慢慢来啊!找到了一个FB工具的网站:http://www.sqlmanager.net/products/ibfb

Posted in BCB||C++, Python, 数据库 | 6 Comments

函数调用终于可以返回值了

前几天的BCB调用Python,没有直接在C++里面调用Python函数,只是简单的使用了PyRun_SimpleString()这个函数进行指定字符串的执行。这种调用,对于没有输出结果,或者是输出结果在文件之类时还是可以使用的,但是通常情况下,我们调用函数是需要返回一个结果给被调用者的。针对这种情况,使用解释字串方式可行性不大了(可以实现,使用输出流重定向,但是处理起来复杂),只能是调用函数,然后接受函数的返回值。 这种调用也是比较简单的(因为我只要求返回字串就可以了:)),首先使用PyImport_ImportModule初始化你要调用的模块(一般指文件名),然后使用PyObject_CallMethod调用你的Python函数,当然了,调用函数的参数是需要设置的。 参考代码:———————————–    AnsiString ScriptPath = ExtractFilePath(Application->ExeName)+“script”;    AnsiString PyStr;    PyObject *pName, *pOs, *pArg, *pResult, *pCall;     Py_Initialize();    InitLogger();     pOs = PyImport_ImportModule(“os.path”);    PyObject_CallMethod(pOs, “join”, “(s)”, ScriptPath.c_str());        pCall = PyImport_ImportModule(“BOMandXY”);    pResult = PyObject_CallMethod(pCall, “ReadBOM”, “(s)”, FileName.c_str());    ShowMessage(PyString_AsString(pResult));     Py_Finalize();

Posted in BCB||C++, Python | Leave a comment

BCB中集成Python终于成功了

这几天经过断断续续的摸索,请教了不少人,也发了不少帖子和mail,终于把Python集成到BCB里面的工作给实现了。 其实按照Python给的文档里面的描述不错,确实是可以使用的,不过那个是发布版本的,而我们的工程默认是DEBUG版本的,里面有一个宏:_DEBUG。所以如果你使用的是默认的工程,编译Python文档给的例子是链接无法通过的。解决的办法就是增加DEBUG的LIB和DLL。开始的时候,我使用的是别人给我的lib库和dll文件,但是在运行的时候,出现错误。经过调试,应该不是我自己程序本身的问题,怀疑debug库是要在自己机器上编译的。然后下个Python的源码,在自己的机器上编译了一个lib和dll,再加入到工程里面就好了。 还发现一个问题,Python在解释的时候,居然不认识\r这个字符,我在PyRun_SimpleString()之前必须要把这个字符替换掉。界面如下

Posted in BCB||C++, Python | 4 Comments