Байт-код Python для & ldquo; Hello world & rdquo; [Дубликат]

Вы должны использовать функцию Arrays.sort. Содержащие классы должны реализовывать Comparable.

7
задан dividebyzero 21 June 2012 в 16:20
поделиться

2 ответа

Существует визуальный дизассемблер python под названием PyChrisanthemum .

Чтобы сделать это способом командной строки, вы можете использовать модуль dis ( python 2.7.3 , python 3.2.3 ), поскольку OP уже обнаружен.

1
ответ дан Nadir Sampaoli 26 August 2018 в 00:58
поделиться

Каждый файл * .pyc представляет собой двоичный файл, содержащий следующие вещи:

  • четырехбайтное магическое число - это просто байты, которые изменяются с каждым изменением на код сортировки;
  • четырехбайтная временная метка модификации - это временная метка модификации Unix исходного файла, которая сгенерировала .pyc, чтобы ее можно было перекомпилировать, если источник изменился;
  • с версии Python3.3 + next четыре байта - это поле, которое кодирует размер исходного файла как long;
  • объект с маршаллированным кодом.

Почему бы просто не использовать встроенный CPython функции для этой задачи?


Файл 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:

  • 2.7. 9
  • 3.4.2
  • 3.5.2

Демонстрация

Содержимое файла main.py

$ cat main.py
print("Never give up")

Создать и прочитать pyc-файл с помощью python2.7

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

Создать и прочитать pyc-файл с помощью python3.4

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

Создать и прочитать pyc-файл с помощью python3.5

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

На основании:

5
ответ дан Community 26 August 2018 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: