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

5

我正在尝试使用Cython并探索代码混淆的可能性 (文章)。特别注意到该文章中提到:

当编译完成后,没有办法将编译后的库反向回到可读的Python源代码!

我使用了这个问题的信息来将我的代码编译成独立的可执行文件。依据我的理解和在文章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

正如您所见,我们有一条带有所有方法名称、正确变量名称和行数的回溯信息,甚至包括原始源代码注释。如果我们重命名变量或更改注释,回溯信息也会相应更改。 我不明白回溯信息是如何显示所有这些信息的。它只有在完整的源代码也存储在可执行文件中时才能以这种方式工作。 请告诉我,我错在哪里了?
更新。我的情况下,回溯信息是从原始.py文件生成的。这个文件与编译后的可执行文件在同一个文件夹中,只因为这样我才得到了回溯信息中所有的源代码和注释。删除原始.py文件后,回溯信息将只包含异常类型和行号,没有其他信息。
1个回答

5
不,它不会嵌入代码。它依赖于能够找到`.pyx`文件——如果您移动该文件,则会收到回溯,但没有原始代码。
如果检查生成的C源代码,您会发现错误处理例程通过`__Pyx_AddTraceback`,然后是`__Pyx_CreateCodeObjectForTraceback`进行,它创建与您的`.pyx`源文件链接的PyCodeObject
在某些情况下(我不确定是什么情况),它会链接到您的`.c`文件。不过,相同的规则也适用——如果找不到源,则不会显示该行。
即使没有`.pyx`文件,您仍将获得有用的方法名的回溯——这些方法名保存在编译后的可执行文件中。

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