python执行现有(&大)C++代码
Posted
技术标签:
【中文标题】python执行现有(&大)C++代码【英文标题】:python executing existent (&big) c++ code 【发布时间】:2009-11-02 02:23:21 【问题描述】:我有一个 C++ 程序,它使用 cryptopp
库来解密/加密消息。
它提供了两个接口方法encrypt
和decrypt
,它们接收一个字符串并通过cryptopp
方法对其进行操作。
有没有什么方法可以在 Python 中同时使用这两种方法,而无需手动包装所有 cryptopp
和包含的文件?
示例:
import cppEncryptDecrypt
string foo="testing"
result = encrypt(foo)
print "Encrypted string:",result
【问题讨论】:
【参考方案1】:如果您可以从该 C++ 代码创建一个 DLL,公开这两种方法(理想情况下为“extern C”,这使得所有接口任务变得如此简单),ctypes 可以是答案,不需要任何第三方工具或扩展名。否则,您可以在cython、老旧的SWIG、SIP、Boost、...之间进行选择——很多很多这样的第三方工具会让您的 Python 代码无需任何必要地调用这两个 C++ 入口点用于包装除它们之外的其他任何东西。
【讨论】:
在 c++ 中的 make dll 上工作和学习:P。将检查 ctypes 是否像我想要的那样工作:D 是的,经过几个小时尝试这个新的 dll 的东西,我达到了目标。谢谢亚历克斯。【参考方案2】:正如 Alex 建议的那样,您可以制作一个 dll,从 python 中导出您想要访问的函数并使用 ctypes(http://docs.python.org/library/ctypes.html) 模块来访问例如
>>> libc = cdll.LoadLibrary("libc.so.6")
>>> printf = libc.printf
>>> printf("Hello, %s\n", "World!")
Hello, World
或者有其他更简单的方法,许多人没有考虑过,但在许多情况下同样有用,即直接从命令行调用程序。你说你已经有工作程序,所以我假设它既可以从命令行加密/解密?如果是,为什么不直接从 os.system 或子进程模块调用程序,而不是深入研究代码并对其进行更改和维护。
除非它不能满足您的要求,否则我会说第二种方式。
【讨论】:
程序作为服务器(套接字)基于此加密和解密数据,然后没有命令行接口:(。除此之外,我不知道是否在每个数据包上调用 cmd 程序性能与从 dll 调用相同... 不,您甚至不应该考虑在每个数据包上启动/关闭进程,因此第二种解决方案不适用于您以上是关于python执行现有(&大)C++代码的主要内容,如果未能解决你的问题,请参考以下文章
双击编译的 C++ Unix 可执行文件未打开现有文件以从中读取信息