【问题标题】:Converting python code to cython [closed]将python代码转换为cython [关闭]
【发布时间】:2016-04-11 03:27:18
【问题描述】:

我有一个使用 OpenCV 的 python 程序。程序现在按预期运行。现在我想使用 Cython 将我的 python 代码编译为 C 代码。我这样做而不是用 C 重写整个程序,因为我仍然希望其他 python 程序能够import my_program

我以前从未使用过 Cython,但刚刚阅读了几篇关于它的博客文章。有人可以告诉我我应该准备什么以及这将是一项艰巨的任务......我目前的python程序是~200 LoC。

【问题讨论】:

  • 使用 200 行脚本,我会继续尝试,看看我遇到了什么问题(如果有的话)。不说这个问题的答案通常没有用。
  • @Anthony 你希望通过这样做实现什么?因为您可能可以使用 Cython 编译您的 Python 代码,而(几乎?)没有对其进行任何更改,但您不会真正获得太多。
  • @DavidW 我这样做的唯一原因是混淆代码,这是 python 不允许的。我知道有人仍然可以对其进行逆向工程,但我的目标只是让他们更难对其进行逆向工程。我从这个答案中得到了这个想法stackoverflow.com/a/7347168/44286
  • @Anthony 在这种情况下,您的代码可能会按原样工作(尽管确实存在不兼容性,但您可能必须非常努力地找到不兼容性)。我可能(可能)看看我是否可以在某个时候回答一些更明显的不兼容问题。
  • @DavidW 在进行更多研究时遇到了liftoff.github.io/pyminifier。你用过吗?在我的唯一目的是使逆向工程代码“更难”但仍然能够允许用户像任何其他模块一样使用import my_code 的情况下,这似乎很有希望。

标签: python opencv cython


【解决方案1】:

根据您的 cmets,您希望“按原样”运行现有代码以避免提供源代码,而不是进行任何重大更改以使用 Cython 特定的功能。考虑到这一点,我希望它能够在没有任何重大努力的情况下正常工作。一种简单的替代方法是只提供 pyc 字节码文件。

我知道的小问题列表(按重要性粗略排序)如下。列出了其他一些in the documentation。其中大部分都是相当小的,所以你会很不幸遇到它们。

  1. 您可能需要为每个平台、32 位和 64 位、每个(主要的,例如 3.4、3.5)版本的 Python 重新编译您的模块,并且可能在具有多个不同编译器的 Windows 上重新编译。

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

  3. 通过检查堆栈(以查看调用它们的函数中定义了哪些变量)尝试做一些聪明的事情的一些事情会中断,例如some of sympy 和可能的字符串格式化的一些快捷方式(@987654323 @对于一些可能使用这个想法的食谱)

  4. 查看函数字节码的任何内容(因为它不是由 Cython 生成的)。 Numba 可能是数值 python 中最常用的示例,但我知道至少有一个(未维护的)MATLAB/Python wrapper 检查调用函数的字节码以尝试计算返回的参数数量。

  5. You must have an __init__.py file to make a folder into a module - it won't recognise a compiled __init__.so file on its own.

  6. String concatenation can go through a fast path in Python that Cython doesn't manage。无论如何,你不应该在你的代码中做太多的事情,但是如果你依赖它,你可能会看到很大的性能差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 2011-05-06
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多