2024-04-26 09:24:55 发布
网友
每个*.pyc文件都是包含以下内容的二进制文件:
为什么不直接使用CPython的内置特性来完成这个任务呢?
一个文件view_pyc_file.py
view_pyc_file.py
import platform import time import sys import binascii import marshal import dis import struct def view_pyc_file(path): """Read and display a content of the Python`s bytecode in a pyc-file.""" file = open(path, 'rb') magic = file.read(4) timestamp = file.read(4) size = None if sys.version_info.major == 3 and sys.version_info.minor >= 3: size = file.read(4) size = struct.unpack('I', size)[0] code = marshal.load(file) magic = binascii.hexlify(magic).decode('utf-8') timestamp = time.asctime(time.localtime(struct.unpack('I', b'D\xa5\xc2X')[0])) dis.disassemble(code) print('-' * 80) print( 'Python version: {}\nMagic code: {}\nTimestamp: {}\nSize: {}' .format(platform.python_version(), magic, timestamp, size) ) file.close() if __name__ == '__main__': view_pyc_file(sys.argv[1])
使用下一个CPython版本进行测试:
文件的内容main.py
main.py
$ cat main.py print("Never give up")
通过python2.7创建和读取pyc文件
setivolkylany$~/Downloads/temp/temp$ python2.7 -m py_compile main.py setivolkylany$~/Downloads/temp/temp$ python2.7 view_pyc_file.py ./main.pyc 1 0 LOAD_CONST 0 ('Never give up') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 1 (None) 8 RETURN_VALUE -------------------------------------------------------------------------------- Python version: 2.7.9 Magic code: 03f30d0a Timestamp: Fri Mar 10 15:08:20 2017 Size: None
通过python3.4创建和读取pyc文件
setivolkylany$~/Downloads/temp/temp$ python3.4 -m py_compile main.py setivolkylany$~/Downloads/temp/temp$ python3.4 view_pyc_file.py __pycache__/main.cpython-34.pyc 1 0 LOAD_NAME 0 (print) 3 LOAD_CONST 0 ('Never give up') 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 10 LOAD_CONST 1 (None) 13 RETURN_VALUE -------------------------------------------------------------------------------- Python version: 3.4.2 Magic code: ee0c0d0a Timestamp: Fri Mar 10 15:08:20 2017 Size: 23
通过python3.5创建和读取pyc文件
setivolkylany$~/Downloads/temp/temp$ python3.5 -m py_compile main.py setivolkylany$~/Downloads/temp/temp$ python3.5 view_pyc_file.py __pycache__/main.cpython-35.pyc 1 0 LOAD_NAME 0 (print) 3 LOAD_CONST 0 ('Never give up') 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 10 LOAD_CONST 1 (None) 13 RETURN_VALUE -------------------------------------------------------------------------------- Python version: 3.5.2 Magic code: 160d0d0a Timestamp: Fri Mar 10 15:08:20 2017 Size: 23
基于:
有一个名为PyChrisanthemum的可视化python反汇编程序。
要使用命令行方式执行此操作,可以使用模块dis(python 2.7.3,python 3.2.3),正如OP已经发现的那样。
dis
每个*.pyc文件都是包含以下内容的二进制文件:
为什么不直接使用CPython的内置特性来完成这个任务呢?
一个文件
view_pyc_file.py
使用下一个CPython版本进行测试:
示范
文件的内容
main.py
通过python2.7创建和读取pyc文件
通过python3.4创建和读取pyc文件
通过python3.5创建和读取pyc文件
基于:
有一个名为PyChrisanthemum的可视化python反汇编程序。
要使用命令行方式执行此操作,可以使用模块
dis
(python 2.7.3,python 3.2.3),正如OP已经发现的那样。相关问题 更多 >
编程相关推荐