编译的独立Cython可执行文件是否仍包含所有原始源代码?

2024-04-25 00:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试验Cython和代码混淆的可能性(article)。在该条中特别指出:

When the compilation is done there’s no way to reverse compiled libraries back to readable Python source code!

我使用这个question信息在独立的可执行文件中编译代码。 在我的理解中,正如文章1中提到的,Cython将Python代码翻译成C代码,并相应地调用Python库(这是正确的吗?)。在其他世界,我们只有C文件作为输出,不能像.pyc文件那样反编译回来。你知道吗

我的测试代码非常简单:

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.pygcc -Os -I /usr/include/python3.5m -o test 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文件后,回溯将只包含异常类型和行号,而不包含其他信息。你知道吗


Tags: 文件to代码pytest信息可执行文件源代码
1条回答
网友
1楼 · 发布于 2024-04-25 00:26:50

不,它不嵌入代码。它依赖于能够找到.pyx文件—如果移动该文件,则会得到一个回溯,但没有原始代码。你知道吗

如果检查生成的C源代码,您会发现错误处理例程经过__Pyx_AddTraceback,然后是__Pyx_CreateCodeObjectForTraceback,这将创建一个链接到.pyx源文件的^{}。你知道吗

在某些情况下(我不知道是什么),它会链接到您的.c文件。但同样的规则也适用-如果找不到源代码,就不会显示该行。你知道吗


即使没有.pyx文件,您仍然会得到一个带有有用方法名的回溯—这些方法名保存在已编译的可执行文件中。你知道吗

相关问题 更多 >