Sta*_*huk 3 python compilation cython
我正在试验 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()
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个可执行文件(在cython --embed -o test.c main.py和之后gcc -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
Run Code Online (Sandbox Code Playgroud)
如您所见,我们对所有方法名称、正确的变量名称和行进行了追溯,甚至包括原始源代码注释。如果我们重命名变量或更改注释 - 它也会在回溯中更改。我不明白回溯如何显示所有这些信息。只有当完整的源代码也存储在可执行文件中时,它才能以这种方式工作。请解释我,我错在哪里?
更新。我的情况下的回溯是从原始 .py 文件生成的。该文件与编译后的可执行文件位于同一文件夹中,因此我在回溯中获得了所有源代码和注释。删除原始 .py 文件后,回溯将只包含异常类型和行号,没有其他信息。
不,它不嵌入代码。它依赖于能够找到.pyx文件 - 如果您移动该文件,那么您将获得回溯但没有原始代码。
如果您检查生成的 C 源代码,您会发现错误处理例程通过__Pyx_AddTraceback, then __Pyx_CreateCodeObjectForTraceback,它会创建一个PyCodeObject链接到您的.pyx源文件。
在某些情况下(我不确定是什么),它会链接到您的.c文件。相同的规则将适用 - 如果它找不到源,它不会显示该行。
即使没有 .pyx 文件,您仍然会获得带有有用方法名称的回溯——这些名称保存在编译后的可执行文件中。
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |