该代码位于exe旁边的原始pyx文件中。删除/不与您的exe一起分发此pyx文件。
查看生成的C代码时,您将看到可执行文件显示错误消息的原因:
对于出现的错误,Cython将发出类似于以下内容的代码:
__PYX_ERR(0, 11, __pyx_L3_error)
其中
__PYX_ERR在宏定义为:
#define __PYX_ERR(f_index, lineno, Ln_error) { __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; }
并且该变量
__pyx_f定义为
static const char *__pyx_f[] = { "test.pyx", "stringsource",};
基本上
__pyx_f[0]告诉可以在哪里找到原始代码。现在,当引发异常时,(嵌入式)Python解释器将查找原始的pyx文件并找到相应的代码(可以
__Pyx_AddTraceback在出现错误时在其中查找该代码)。
一旦这个pyx文件不存在,原始的源代码将不再为Python解释器/其他任何人所了解。但是,错误跟踪将仍然显示函数的名称和行号,但不再显示任何代码段。
生成的可执行文件(或扩展名,如果有人创建的话,则扩展名)不包含任何字节码(如pyc文件中的内容),并且无法使用以下工具反编译
uncompyle:将py文件翻译成Python操作码后生成字节码,然后在一个巨大的循环
ceval.c。但是对于内置/
cython模块,则不需要字节码,因为生成的代码直接使用Python的C-API,从而消除了对操作码进行评估的需要-
这些模块跳过了解释,这是它们变得更快的原因。因此,可执行文件中将没有字节码。
但是,有一个重要的注意事项:应该检查链接器是否不包含调试信息(因此,可以在其中找到pyx文件内容的C代码作为注释)。带
/Z7选项的MSVC就是这样的示例。
但是,可以将生成的可执行文件反汇编到汇编器中,然后可以对生成的C代码进行逆向工程-
因此,虽然cythonizing可以使代码难以理解,但它不是隐藏密钥或安全算法的正确工具。