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

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 =

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

编译完成后,无法将编译后的库还原为可读的Python源代码

我使用此信息在独立可执行文件中编译代码。 在我的理解中,正如本文中提到的,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.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文件,您仍然会得到一个带有有用方法名的回溯,这些方法名保存在已编译的可执行文件中