请教!有熟悉Python的吗?Python如何调用DLL?

Discussion in 'Python & Quantopian' started by wj2000, Mar 21, 2010.

  1. 请教!有熟悉Python的吗?Python如何调用DLL?
    找了一些资料,基本上都是需要针对Python的特性在编写DLL时在源代码级就需要做特别的处理,然后再由Python来调用。另外Python通过 ctypes 来调用DLL,是不是那些被调用的DLL本身就需要是 ctypes 支持的才可以?
    不知道Python是不是可以支持象“综合交易平台”接口资料里的那些DLL?如果可以如何操作?有借鉴的资料吗?或者最好有一个简单的范例供参考!
    谢谢
     
  2. 不太方便的。印象中还没人为Python包装CTP的dll
     
  3. 不是要包装好的Python包装CTP的dll,而是看看是不是可以实现,或者如何实现?
    如果可行,我就打算搞,有个简单的范例或资料参考就行了。:p

    就是想不安装c/c++和C#这些编译平台,打算只使用Python。
     
  4. 如果DLL是C語言開發的,導出函數符合stdcall調用約定,那用ctypes調用應該沒問題,這和python直接調用Windows的Win32 API DLL約定一樣的。
    如果DLL是C++語言開發的,那可能就要在DLL源代碼里進行包裝了,亦就是開發python擴展模塊。
     
  5. 奥,谢谢
    那看来用Python直接调用“综合交易平台”的DLL有点麻烦了,它好像是c++编写的,只提供了头文件(.h)和dll和lib
     
  6. CTP的DLL是C++开发的。见过有朋友想用java来包装也觉得比较麻烦。
     
  7. SWIG 看资料好像是需要dll的源代码来转换的?而有了dll源代码那怎么处理都可以的,但几乎是不可能获得第3方提供的dll文件的源代码的阿。
     
  8. SWIG是一个能将C或者C++编写的程序与其它各种高级语言如Perl, Python, Ruby, 和 Tcl进行联接的开发工具。其原理是从C/C++头文件中找到申明并利用他们生成脚本语言访问C/C++代码所必须的封装代码。SWIG具有高度可自定义的特点,它能帮助你生成适合你的应用程序的封装包。

    --------------------------------------------

    说的是从头文件中找到声明生成脚本语言的封装代码。
     
  9. Last edited by a moderator: Mar 21, 2010
  10. python用swig调dll是个伪命题
    文章出处:飞诺网(http://www.diybl.com/course/3_program/c++/cppjs/200847/108568.html)

    以前以为通过swig可以在python里直接调dll,实现c++中loadlibrary一样的功能。但是实际上如果你有一个非自己编的dll的话你是无法通过swig来调用的。比如调windows的系统dll。

    只有自己写的代码生成的dll才可以通过swig来调,而且实际上调的也不是dll,而是.pyd文件。也就是说用生成dll的代码通过.i和_swap.cxx文件一起生成一个.pyd文件,python在调用c++的函数的时候实际是链接的.pyd。没有这个文件是不能成功调dll的。

    swig实际是调用c代码的,想调dll的人,要不自己有dll的代码,要不放弃这个念头,要不等着技术的发展吧。
     
  11. 真要搞是可以搞的,python直接調用此dll是沒辦法。但你可以先用VC++或C#開發一個接口層程序,做好調用這個DLL所需的初始化處理和包裝過渡工作,這部分等于就是對DLL進行開發。然后反過來,把python做為腳本語言嵌入到這個程序(如魔獸中的Lua),再通過這個內嵌的腳本語言在程序內部調用DLL的功能進行快速策略開發。
     
  12. 这部分应该就是SWIG完成的功能。

    1. SWIG把目标对象的C/C++声明按照Python的C接口规范重新做了一层Wrapper,然后用编译器编译成.pyd, 这个就是上面说的一个接口. 这样在python中就可以直接import进来使用

    由python 调用目标dll 变成了 由python调用 SWIG生成的中间对象,再由中间对象与原库打交道。
     
  13. java和python都是好东西,
    强烈要求综合交易平台提供java和python版本的api.:D
     
  14. 恩,SWIG还真是一个办法。

    现在又有点犹豫了,好像说Python的效率比Ruby差不少?有熟悉Ruby的介绍下吗?

    谢谢
     
  15. SWIG还是有问题,生成pyd的时候需要用到DLL的源代码来编译,那等于没用。只是方便拥有原始源代码的采用SWIG来生成可以被其他语言调用的DLL
     
  16. 干嘛不用Lua~你需要用到那些高級語言糖衣嗎?語法上的效率,是針對集體項目方便協作交流,方便不同功能對接而言的;個人自用開發,語法越簡單越容易理解越容易調試效率越高。
     
  17. 主要是考虑学习成本的问题:p
    只有过去10多年前的c语言和unix下的编程和shell经验,结构化编程(过程编程),对windows和面向对象没经验,原先考虑python和Ruby就是看到它们最接近c和shell。
    因为不太想搞个编译器,过去编译c的时候有体会,一点点小改动都需要重新编译,比较麻烦,这个也是动态解析语言的长处了。

    Lua我也去找些资料看看,关键还是看它们是不是能很方便的调用第3方提供的接口DLL,因为目的就是为了使用第3方提供的接口,这些接口也一般都是以dll方式提供的。如果都是不很方便的,那只能考虑针对提供的接口使用相应的编程语言来处理了。