Python 编译的独立Cython可执行文件是否仍然包含所有原始源代码?
我正在试验Cython和代码混淆的可能性()。该条特别指出: 编译完成后,无法将编译后的库还原为可读的Python源代码 我使用此信息在独立可执行文件中编译代码。 在我的理解中,正如本文中提到的,Cython将Python代码转换为C代码,并相应地调用Python库(这是否正确?)。在其他世界中,我们只有C文件作为输出,不能像.pyc文件那样反编译回来 我的测试代码非常简单:Python 编译的独立Cython可执行文件是否仍然包含所有原始源代码?,python,compilation,cython,Python,Compilation,Cython,我正在试验Cython和代码混淆的可能性()。该条特别指出: 编译完成后,无法将编译后的库还原为可读的Python源代码 我使用此信息在独立可执行文件中编译代码。 在我的理解中,正如本文中提到的,Cython将Python代码转换为C代码,并相应地调用Python库(这是否正确?)。在其他世界中,我们只有C文件作为输出,不能像.pyc文件那样反编译回来 我的测试代码非常简单: def my_crashing_function(): x = "1" y = 2 test =
def my_crashing_function():
x = "1"
y = 2
test = x + y # we will crash here
if __name__ == "__main__":
my_crashing_function()
但是当我运行这个可执行文件时(在cython--embed-o test.c main.py
和gcc-Os-I/usr/include/python3.5m-o test.c-lpython3.5m-lpthread-lm-lutil-ldl-s
之后)
我得到的错误如下:
user@debian:~# ./hello
Traceback (most recent call last):
File "main.py", line 7, in init main
my_crashing_function()
File "main.py", line 4, in main.my_crashing_function
test = x + y # we will crash here
TypeError: Can't convert 'int' object to str implicitly
如您所见,我们对所有方法名、正确的变量名和行进行了回溯,甚至对原始源代码注释也进行了回溯。若我们重命名变量或更改注释,它也将在回溯中更改。
我不明白traceback如何显示所有这些信息。只有当完整的源代码也存储在可执行文件中时,它才能以这种方式工作。
请解释一下,我错在哪里
更新。在我的情况下,回溯是从原始的.py文件生成的。这个文件和编译的可执行文件在同一个文件夹中,正因为如此,我在回溯中获得了所有源代码和注释。删除原始.py文件后,回溯将只包含异常类型和行号,而不包含其他信息。否,它不嵌入代码。它依赖于能够找到
.pyx
文件-如果您移动该文件,那么您将得到一个回溯,但没有原始代码
如果检查生成的C源代码,您会发现错误处理例程经过\uuupyx\uaddtraceback
,然后执行\uuuupyx\uCreateCodeObjectfortraceback
,这将创建一个链接到.Pyx
源文件的链接
在某些情况下(我不确定是什么),它会链接到您的.c
文件。但同样的规则也适用——如果找不到源代码,则不会显示该行
即使没有.pyx文件,您仍然会得到一个带有有用方法名的回溯,这些方法名保存在已编译的可执行文件中