将Python代码转换为Cython

3

我有一个使用OpenCV的Python程序。目前该程序如预期运行。现在我想使用Cython将我的Python代码编译为C代码。我这样做是因为我不想完全用C重新编写整个程序,而是希望其他Python程序仍然可以 import my_program

我以前从未使用过Cython,但刚刚阅读了一些博客文章。请问有人能告诉我应该做好哪些准备工作,这将是多么艰巨的任务...... 我现有的Python程序大约有200行代码。


有一个200行的脚本,我会直接尝试运行它,看看是否会遇到任何问题。并不是说这个问题的答案在一般情况下没有用处。 - Dan Mašek
@Anthony,你通过这样做希望实现什么目标?因为你可能可以使用Cython编译你的Python代码,几乎不需要(或者只需要很少)对其进行修改,但实际上你可能没有获得太多的优势。 - DavidW
@DavidW 我这么做的唯一原因是为了使代码混淆,而Python不允许这样做。我知道有人仍然可以对其进行反向工程,但我的目标只是让他们更难反向工程。我从这个答案得到了这个想法:https://dev59.com/AnVC5IYBdhLWcg3wihuv#7347168 - Anthony
@Anthony 如果是这种情况,你的代码可能会原封不动地工作(虽然存在不兼容性,但你可能需要花费很大的力气才能找到)。也许我可以在某个时候回答一些更明显的不兼容性问题。 - DavidW
@DavidW 在做更多研究时,我发现了https://liftoff.github.io/pyminifier/。你用过吗?对于我的情况似乎很有前途,我唯一的目的是使逆向工程代码“更难”,但仍然能够让用户像导入任何其他模块一样`import my_code`。 - Anthony
显示剩余3条评论
1个回答

2
根据您的评论,您希望运行现有代码“原样”以避免提供源代码,而不是进行任何重大更改以使用Cython特定功能。考虑到这一点,我预计它应该可以在没有任何主要努力的情况下正常工作。一个简单的替代方案是考虑提供pyc字节码文件。
以下是我知道的一些小问题清单(按重要性粗略排序)。另外还列出了一些其他问题在文档中。这些大多数都是相当小的问题,所以你可能不会遇到它们。
  1. 你可能需要为每个平台,32位和64位,每个(主要的,例如3.4、3.5)使用的Python版本重新编译你的模块,并且在Windows上可能需要使用多个不同的编译器。

  2. 你不能在模块级别使用__file__。当尝试查找与代码存储在相同位置的静态资源的路径时,这有时会成为问题。

  3. 一些尝试通过检查堆栈(查看调用它们的函数中定义的变量)来做聪明事情的东西会出现问题,例如sympy中的一些和可能一些快捷方式到字符串格式化(请参见一些可能使用这个想法的示例)。

  4. 任何查看函数的字节码的东西(因为它不是由Cython生成的)。Numba可能是数值Python中最常用的例子,但我知道至少有一个(未维护的)MATLAB/Python包装器会检查调用函数的字节码以尝试确定返回的参数数量。

  5. 你必须有一个__init__.py文件才能将一个文件夹变成一个模块——它不会单独识别已编译的__init__.so文件

  6. 字符串连接可以通过Python中的快速路径进行,而Cython不管理。你在代码中不应该过多地依赖这一点,但是如果你依赖它,你可能会看到很大的性能差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接