Python compiler script bytecode python software foundation

How to generate byte code file in python ?

Whenever the Python script compiles, it automatically generates a compiled code called as byte code. The byte-code is not actually interpreted to machine code, unless there is some exotic implementation such as PyPy. The byte-code is loaded into the Python run-time and interpreted by a virtual machine, which is a piece of code that reads each instruction in the byte-code and executes whatever operation is indicated. Byte Code is automatically created in the same directory as .py file, when a module of python is imported for the first time, or when the source is more recent than the current compiled file. Next time, when the program is run, python interpreter use this file to skip the compilation step. Running a script is not considered an import and no .pyc file will be created. For instance, let’s write a script file abc.py that imports another module xyz.py. Now run abc.py file, xyz.pyc will be created since xyz is imported, but no abc.pyc file will be created since abc.py isn’t being imported. But there exist an inbuilt py_compile and compileall modules and commands which facilitate the creation of .pyc file.

  1. Using py_compile.compile function: The py_compile module can manually compile any module. One way is to use the py_compile.compile function in that module interactively:
>>> import py_compile >>> py_compile.compile('abc.py')
  1. This will write the .pyc to the same location as abc.py.
  2. Using py_compile.main() function: It compiles several files at a time.
>>> import py_compile >>> py_compile.main(['File1.py','File2.py','File3.py'])
  1. Using compileall.compile_dir() function: It compiles every single python file present in the directory supplied.
>>> import compileall >>> compileall.compile_dir(directoryname)
$ python -m py_compile File1.py File2.py File3.py .
$ python -m py_compile - File1.py File2.py File3.py . . .
  1. Using compileall in Terminal: This command will automatically go recursively into sub directories and make .pyc files for all the python files it finds.
Читайте также:  Check what php version

Note: The compileall and py_compile module is part of the python standard library, so there is no need to install anything extra to use it. References: 1. https://docs.python.org/3/library/py_compile.html 2. https://docs.python.org/2/library/compileall.html 3. Effbot This article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Источник

Python compiler script bytecode python software foundation

Программы для декомпиляции скриптов Python

Программы для декомпиляции скриптов Python

Python — это один из наиболее популярных современных языков программирования. Его поддерживают в качестве скриптового языка различные программы, на нем написано огромное количество различных модулей, плагинов и тому подобное. Исходные тексты на Python можно компилировать в файлы с расширением .pyc, после компиляции они превращаются в нечитаемые бинарные данные. Это далеко не текстовый файл, поэтому, чтобы внести изменения или изучить алгоритм работы такого скрипта, потребуется привести его к исходному виду, то есть декомпилировать. Как ни странно, при всей популярности языка Python, инструментов для реверсинга .pyc-файлов создано не так уж и много.

Все декомпиляторы для Python, которые я встречал, написаны на нем же самом. С одной стороны, это облегчает понимание их работы, дает возможность доработки. Но с другой стороны, ничего не будет работать «из коробки», для запуска потребуется немало напрячься. Все перечисленные в статье инструменты представляют собой оболочки для автоматизации работы с готовыми декомпиляторами.

Скриншот программы Easy Python Decompiler

Скриншот программы Easy Python Decompiler

Easy Python Decompiler — оболочка для декомпиляторов Uncompyle2 и Decompyle++. Не требует установленного Python, может декомпилировать как отдельные скрипты, так и целые папки. С помощью Uncompyle2 прекрасно справляется с .pyc-файлами, скомпилированными версиями Pytyhon 1.0-2.7. Тут никаких вопросов нет, Uncompyle2 — самый лучший инструмент для этого, но, к сожалению, его разработка прекращена. Decompyle++ по заверениям авторов, должен поддерживать компиляторы Python аж до самой новой 3.4, но на деле все не так радужно. Простенькие скрипты уровня «Hello World!» версий Python 3.x он отрабатывает еще нормально, более серьезные скрипты гарантированно вызовут падение декомпилятора. Скачать Easy Python Decompiler можно с офсайта или по ссылке ниже.

Easy Python Decompiler 1.3.2

Скриншот программы PjOrion

Скриншот программы PjOrion

PjOrion — отечественная разработка, универсальный инструмент для декомпиляции и дизассемблирования Python-скриптов. Изначально создавался для работы с какими-то модами WoT, но вполне может быть использован и для наших целей. Также не требует установленного Python, но при необходимости может легко подключить любую версию Python, установленную на компьютере. Кроме уже упомянутых Uncompyle2 и Decompyle++, для декомпиляции использует еще два инструмента — Fupy и pyREtic. Оба они поддерживают компилятор Python только до версии 2.7 включительно, но хуже того, что они глючные. Повторюсь, что Uncompyle2 по качеству результата еще никто не превзошел. Рабочих декомпиляторов для Python 3.x все также нет. В PjOrion есть полезная функция определения версии компилятора, так что не ошибетесь, какой модуль Python выбрать. Но главная прелесть, ради которой стоит держать PjOrion в коллекции реверсера, — это дизассемблер Python-скриптов. И пока что это единственный инструмент, который можно применить для анализа компилированных скриптов версий 3.x. Конечно, специфическому дизассемблерному листингу очень далеко до красивого декомилированного исходника, но при наличии некоторого опыта можно хотя бы понять логику работы скрипта. Скачать PjOrion можно с офсайта или отсюда.

Ren

Ren’Py

Unrpyc — декомпилятор для скриптов, созданных в игровом движке Ren’Py. Они хоть и пишутся на Python, но имеют свой внутренний формат и после компиляции не поддаются анализу обычными средствами. Декомпилятор работает из командной строки и требует наличие установленного Python.

Скриншот программы Py2Exe Binary Editor

Скриншот программы Py2Exe Binary Editor

Py2Exe Binary Editor не совсем относится к декомпиляторам, но используется как вспомогательная утилита для извлечения всех компонентов из исполняемых файлов, созданных при помощи py2exe. С помощью Py2Exe Binary Editor можно легко извлечь Python-скрипт для дальнейшего анализа. Как и сам py2exe, редактор работает только со 2-й версией Python.

Py2Exe Binary Editor 0.1

На этом заканчивается и без того скромный список декомпиляторов для Python. Если у вас есть что-нибудь для этих же задач, то большая просьба поделиться. Особенно интересуют рабочие декомпиляторы для Python 3.x.

Источник

Python Bytecode Compiler Written in Python

This is WIP port of Python2 stdlib compiler package to Python3.

Motivation: to have an easily hackable Python compiler for experimenting (e.g. various optimizations, instrumentation, semantic variants, etc.)

The porting project concentrates on the conversion of AST (as provided by the builtin «ast» module) to bytecode and code objects. The original Python2 package included another important part: conversion of concrete parse tree into Abstract Syntax Tree (AST). While it would be interesting to ultimately have complete pure-Python closed loop for Python compilation, to keep this specific project maintainable, lexing, parsing, AST building are outside of its scope. Other projects are welcome to provide integrated maintainable solutions for those areas (indeed, generic/non-integrated solutions for them definitely exist).

  • Port the original «compiler» package to work with AST as produced by Python3’s «ast» module.
  • Initially, implement support for Python3.5 syntax and bytecode.
  • Cleanup the original code.

History of Python2 «compiler» package:

  1. The code is based on earlier work done by Greg Stein and Bill Tutt for Python2C (aka Py2C aka p2c) project circa 1997-1999. That code however didn’t include bytecode compiler, but just transformer.py module, which converted low-level Python parse tree, as produced by the built «parser» module, into a higher-level Abstract Syntax Tree (AST). The Python2C project itself generated C code from this AST.
  2. Actual bytecode compiler was started and largely written by Jeremy Hylton. Initial commits importing Python2C files and starting pycodegen.py were made on 2000-02-04.
  3. 66 commits were made in 2000, 73 in 2001, 10 in 2002, 6 in 2003, 15 in 2004, 9 in 2005, 51 in 2006, 16 in 2007.
  4. In May 2007, complaints are heard that it’s hard to maintain and regularly broken: https://mail.python.org/pipermail/python-3000/2007-May/007575.html
  5. Those transformed into an entry in PEP3108 for its removal.
  6. Removed in of 3.x branch in revision a8add0ec5ef05c26e1641b8310b65ddd75c0fec3 on 2007-05-14.
  7. The funtionality wasn’t totally gone, instead functionality of internal C-based compiler was exposed in a similar fashion (albeit with changed/cleaned up API). E.g., compiler.ast and compiler.transformer was replaced with builtin «_ast» module (in other words, AST node type definitions and transformation of parse tree to AST are now done on C level). compiler.visitor was replaced with Python-level «ast» module. Compilation of AST into bytecode is handled using builtin compile() function with suitable parameters.

Usage

Currently, the package is intended to work with CPython3.5 only.

python3.5 -m compiler --help python3.5 -m compiler

By default, the command above compiles source to in-memory code objects and executes it. If -c switch is passed, instead of execution, it will be saved to .pyc file. If —dis is passed, code will be disassembed before executing/saving.

Running Tests

The projects includes a builtin test corpus of various syntactic constructs to verify codegeneration against reference output produced by CPython3.5. Currently, the project does not include peephole optimizer as included as a postprocessing pass in CPython. This means that testing should happen against modified CPython3.5 build with the peephole optimizer disabled.

The patch is available at https://github.com/pfalcon/cpython/tree/3.5-noopt This repository includes build-cpython-compiler.sh helper script to download and build it. It will produce a python3.5-nopeephole symlink in the top-level directory, where scripts below expect to find it.

To produce reference code generation output from python3.5-nopeephole, run:

./test_testcorpus_prepare.py 

This needs to be done once. Afterwards, you can run

to compare the output produced by this compiler package against the reference.

Authorship and Licensing Info

The source code is based on the «compiler» package from Python2 standard library. It is licensed under Python Software Foundation License v2. See complete licensing terms and details in file LICENSE.

The «compiler» package is a result of dedicated work of a number of individuals, listed below (based on the git history of the official CPython repository).

Porting of the code to Python3 and further maintenance is handled by Paul Sokolovsky.

Contributors to Python2 version of the package:

$ git clone https://github.com/python/cpython $ cd cpython $ git checkout 2.7 $ git log --follow Lib/compiler | grep ^Author | sed -e 's/<.*>//' | sort | uniq -c | sort -n -r # Email addresses not included to minimize spam 143 Author: Jeremy Hylton 18 Author: Neal Norwitz 18 Author: Guido van Rossum 17 Author: Georg Brandl 11 Author: Tim Peters 9 Author: Thomas Wouters 7 Author: Neil Schemenauer 6 Author: Michael W. Hudson 6 Author: Martin v. Löwis 4 Author: Brett Cannon 3 Author: Nick Coghlan 3 Author: Antoine Pitrou 2 Author: Raymond Hettinger 2 Author: Ezio Melotti 2 Author: Christian Heimes 2 Author: Benjamin Peterson 2 Author: Anthony Baxter 2 Author: Andrew M. Kuchling 2 Author: Alexandre Vassalotti 1 Author: Serhiy Storchaka 1 Author: Phillip J. Eby 1 Author: Jeffrey Yasskin 1 Author: Gustavo Niemeyer 1 Author: Greg Stein 1 Author: Facundo Batista 1 Author: Eric Smith 1 Author: Collin Winter 1 Author: Barry Warsaw 1 Author: Amaury Forgeot d'Arc 

Aka «why I took Python2’s compiler package and spent all this effort on it instead of using something else».

  • PyPy is the obvious direction of thought. PyPy is a very advanced and big project. Somewhere in there a small hadron collider may be lurking. But what if you want a simple Python compiler without a hadron collider? You may be out of luck to extract it, or at least I was.
  • YaPyPy — looks absolutely great, but its docs miss to explain how to actually run it. I mean, that small part of docs (README) which is written in English. There’re more docs in Chinese, but unfortunately, I can’t read it.
  • tailbiter is a great project showing how to develop a Python bytecode compiler from scratch, and is highly recommended for that purpose. But I wanted to get a «production ready» (read: behaving the same way as CPython’s) compiler in reasonable time with reasonable effort, not write one from scratch.

Источник

Оцените статью