如何将Python代码编译成字节码?

How to compile Python code into byte code?

提问人:Dimuth De Zoysa 提问时间:8/24/2023 最后编辑:Dimuth De Zoysa 更新时间:8/26/2023 访问量:171

问:

例如,假设我有 myfile.py。
示例代码:

a = 6
b = 4
print(a+b)

那么如何将其转换为字节码呢?

我试过了这个:

source_code = '''a = 6
b = 4
print(a+b)'''
compiled_code = compile(source_code, '<string>', 'exec')
print(compiled_code.co_code)

结果:

b'\x97\x00d\x00Z\x00d\x01Z\x01\x02\x00e\x02e\x00e\x01z\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00d\x02S\x00'

它确实给了我一个字节码,但是当我使用 exec() 运行它时,它会导致此错误。

Traceback (most recent call last):
  File "c:\Users\Dimuth De Zoysa\Desktop\Python_projects\OBftestcode.py", line 2, in <module>
    exec(bytecode)
ValueError: source code string cannot contain null bytes

如何在执行字节码时隐藏源代码?

Python 编译 执行 字节码

评论

2赞 Kelly Bundy 8/24/2023
怎么不给你一个NameError?你从来没有定义过......exec(bytecode)bytecode
2赞 Adam.Er8 8/24/2023
exec(compiled_code)效果很好
0赞 ekhumoro 8/24/2023
如果您需要使用实际的字节码,例如 decompyle3
0赞 Lee 8/25/2023
仅提一下,您可以使用 jythonc 将 python 文件编译成字节码

答:

-2赞 purval_patel 8/24/2023 #1

请尝试以下代码:

import codecs

source_code = '''a = 6
b = 4
print(a+b)'''

compiled_code = compile(source_code, '<string>', 'exec')

# Convert bytecode to hexadecimal representation
bytecode_hex = codecs.encode(compiled_code.co_code, 'hex')
print(bytecode_hex)

评论

2赞 jlgarcia 8/24/2023
这如何解决问题?实际上已经工作正常了。exec(compiled_code)
1赞 TimKostenok 8/24/2023 #2

不要执行结果字节码。将编译后的代码作为编译函数返回的对象执行,如下所示:

source_code = '''a = 6
b = 4
print(a+b)
''' # good style for using such functions as compile and others is to
#     write new line character at the end of the code
compiled_code = compile(source_code, '<string>', 'exec')
exec(compiled_code)

不要执行 ,因为它包含转换为可查看形式的字节码,这样做会产生错误。exec(compiled_code.co_code)

评论

0赞 Dimuth De Zoysa 8/26/2023
还行。但是我只是想隐藏源代码,这样就没人能看到它了
1赞 Steven Dickinson 8/24/2023 #3

请参阅 https://docs.python.org/3/library/functions.html#exechttps://docs.python.org/3/library/functions.html#compile

exec(compiled_code)会正常工作。

您是否错误地尝试执行字符串表示而不是实际code_object?

评论

0赞 Dimuth De Zoysa 8/26/2023
那么我怎么能只执行字节码而不显示源代码。
1赞 Steven Dickinson 8/26/2023
不太确定你为什么要这样做。但是,似乎您想创建一个可以从原始字节码而不是源代码“执行”的code_object。你可能想看看 stackoverflow.com/questions/16064409/...。不适合佯攻的人。