У меня есть функция, которая возвращает строку. Строка содержит символы возврата каретки и перевода строки (0x0D, 0x0A). Однако когда я пишу в файл, он содержит только новые переводы строк. Есть ли способ получить вывод, включающий возврат каретки и новую строку.
msg = function (arg1, arg2, arg3) f = open ('/tmp /output ',' w ') f.write (msg) f.close ()
Если вы хотите записывать байты, вы должны открыть файл в двоичный режим.
f = open ('/tmp/output', 'wb')
Записать байты и создать файл, если он не существует:
f = open ('./put/your/ path/here.png ',' wb ') f.write (data) f.close ()
wb
означает открытие файла в режим записи в двоичном формате
.
2
/python-bytecode
Это приложение предоставляет возможность конвертировать файлы Python в их файлы .pyc . Файлы Python .pyc — это скомпилированные файлы Python, скомпилированные в байт-код. Если вы когда-нибудь задумывались, почему иногда Python генерирует их и папку __ pycache__
, то это из соображений производительности.
Цель этого упражнения — раскрыть внутреннюю часть Python, чтобы что некоторые люди могут экспериментировать с написанием своего собственного языка, который работает на виртуальной машине Python. Многие новейшие языки, такие как Scala и Clojure, работают на JVM. Они стали популярными, потому что сразу поставляются с включенными батареями , так сказать, потому что они способны импортировать все существующие библиотеки Java. Возможно, Python является более чистым языком, чем Java, поэтому было бы полезно иметь функциональный язык, например, который хорошо интегрируется с Python — языком, который следует принципам Pythonic (см. import this
). Я планирую работать над таким языком, но я хотел бы открыть шлюзы для всех остальных.
Генерация байт-кода ( .pyc файлы )
Файлы .pyc имеют следующую структуру:
- 4 байтов : Магическое число
- 4 байта : Отметка времени
- 4 байта :
- N байтов : Маршалированный объект кода
Вы можете заставить каждый сегмент создать файл .pyc следующими способами:
- магическое число соответствует требуемой версии Python. Вы можете получить этот номер с помощью модуля imp :
import imp
magic_number = imp.get_magic ()
- timestamp соответствует времени его создания. Если есть соответствующий . py , он проверяет эту отметку времени с этим файлом, чтобы увидеть, совпадают ли они. В противном случае это не имеет значения, если файл .pyc находится сам по себе. Вы можете получить это число с помощью модулей time и struct :
import struct, time
timestamp = struct.pack ('i', int (time.time ()))
- Заполнение — это просто заполнение перед объектом кода, в основном 4-байтовая последовательность нулей. Кажется, что это дополнение есть только в Python 3, поэтому опустите его для Python 2 . Иногда первый байт имеет какое-то значение, но это не кажется актуальным. Вы можете просто использовать эту строку байтов:
b'A x00 x00 x00 '
- Объект кода — это упорядоченный объект кода Python. Вы можете использовать команду
compile
для компиляции сегмента кода Python в объект кода, чтобы сначала проверить это. Подпись команды:compile (code_segment, 'file_name', 'exec')
. Вам необходимо убедиться, чтоимя_файла
соответствует имени файла, в который вы записываете файл .pyc . Вот простой пример:
маршал импорта
filename = 'addnum.py'
code_segment = 'a = 123 + 321 nprint (a)'
code = compile (code_segment, filename, 'exec')
marshalled_code_object = marshal.dumps (code)
Вы можете собрать все это вместе следующим образом:
# записать в addnum.pyc с open (filename + 'c', 'wb') как f: f.write (magic_number) f.write (timestamp) f.write (padding) f.write (marshalled_code_object)
А затем вы можете протестировать его как обычный файл Python, он должен работать!
$ python addnum.pyc 444
Вы можете проверить компилятор байт-кода, запустив python bytecode.py [файл .py]
или pybytecode [.py файл]
из командной строки.
Написание объектов кода
Вы можете писать объекты Python, импортировав тип CodeType следующим образом: из типа импорта CodeType
. Вы можете просмотреть справку по необходимым параметрам ( help (CodeType)
), а также в Интернете довольно много документации по различным частям объекта кода Python. Сообщение Альберто на StackOverflow дает довольно приличный обзор каждого из них. Я включил его код как часть codegen.py
. Коды операций см. В разделе ресурсов README, чтобы вы могли начать писать компилятор байт-кода для вашего собственного языка, который можно читать с помощью виртуальной машины Python!
Вы можете протестировать генератор кода, запустив python codegen.py
или pycodegen
из командной строки.
Resources
-
Инструкции по байт-коду Python и их описания можно найти в документации модуля dis .
-
Вы можете просмотреть все коды операций Python из исходного кода Python в файле Include/opcode.h.
-
Если есть сомнения, создайте объект кода нужного вам типа сегмента, используя
code = compile (code_segment, my_file_name, 'exec')
, а затем дизассемблируйте его, используяdis.dis (code)
, а затем создание байт-кода путем преобразования в коды операций и соответствующие параметры (см. codegen.py и opcode.h). -
Хотя оба из них больше не поддерживаются, вы можете проверить PEAK и Byteplay для сборки байт-кода.