Компиляция Python в собственный код?

Возможный дубликат:
Возможно ли скомпилировать Python в машинный код?

Можно ли скомпилировать код Python (плюс его зависимости и библиотеку интерпретатора) в единственный, родной исполняемый файл Windows (без ничего в комплекте вместе с ним) из файла Python? (Вроде того, как компилятор GNU для Java компилирует Java в родной (громоздкий) исполняемый файл, который содержит все в истинном машинном коде.)

Если да, то как мне это сделать?

(В частности, py2exe не выполняет то, что я хочу - он включает библиотеки внутри отдельного файла ZIP, а также включает интерпретатор как отдельный DLL.)

Примечание 1:

Подчеркну, я не прошу самораспаковывающийся архив, исполняемый упаковщик или какой-либо другой способ "обмана" путем объединения файлов внутри exe - Я ищу что-то, что действительно преобразует Python в собственный исполняемый файл, например, что GCJ делает для Java.

Заметка 2:

Только если вышеуказанное невозможно:

Возможно ли хотя бы сгенерировать одиночный исполняемый файл из кода Python, содержащего интерпретатор, объединенный вместе со всеми зависимостями библиотеки, так что результирующий исполняемый файл не должен само- распаковать на целевой диск перед запуском?

В этом сценарии требование «компиляции» ослаблено: не имеет значения, действительно ли код скомпилирован в машинный код (его можно просто встроить как текстовый ресурс в целевой исполняемый файл), но результат, тем не менее, должен быть < em> одиночный exe файл [и ничего больше], который может работать автономно, в частности, без необходимости распаковывать / устанавливать что-либо на целевой диск перед запуском.


person user541686    schedule 09.01.2012    source источник
comment
Я думаю, вы можете создавать собственные двоичные файлы .net с помощью Python, но они не будут монолитными (будут зависеть от среды выполнения .net).   -  person Paulo Scardine    schedule 09.01.2012
comment
@PauloScardine: Да, я тоже не ищу этого. :) Спасибо, что указали на это.   -  person user541686    schedule 09.01.2012


Ответы (2)


Shed Skin может компилировать Python в C ++, но только ограниченное его подмножество. Некоторые аспекты Python очень сложно скомпилировать в собственный код.

person Taymon    schedule 09.01.2012
comment
+1 похоже, это именно то, что мне нужно; Я обязательно попробую. - person user541686; 09.01.2012
comment
Стреляйте ... похоже, что полученный исполняемый файл все еще зависит от libpcre-0.dll, libgcc_s_dw2-1.dll и libstdc++-6.dll. Если я не смогу избавиться от них, статически связавшись с GCC, это не сработает ... - person user541686; 09.01.2012

Короткий ответ - нет, и он подойдет практически для любого языка: любая программа, которую вы пишете, будет зависеть от некоторых внешних библиотек, даже если это только системные библиотеки DLL Windows.

Если вы написали программу на C и скомпилировали ее с помощью компилятора Microsoft, вам все равно потребуется установить библиотеки времени выполнения C. Скорее всего, они уже будут в большинстве систем, но это не гарантируется. Точно так же, даже если вам удалось скомпилировать интерпретатор C Python, статически связанный с его библиотеками, вам все равно придется откуда-то получать среду выполнения C.

Я подозреваю, что вы действительно спрашиваете, можете ли вы скомпилировать один .exe, который зависит только от библиотек, которые, как вы ожидаете, уже будут установлены. Так все зависит от того, что вы готовы считать частью базовой системы? Можете ли вы предположить, что установлены .Net framework 4 или Silverlight? Если да, то вам стоит взглянуть на IronPython.

Точно так же pypy может быть построен с помощью набора инструментов Visual Studio или MinGW, но я уверен, что в обоих случаях вам все равно понадобятся некоторые внешние библиотеки во время выполнения.

person Duncan    schedule 09.01.2012
comment
вам все равно нужно откуда-то получить среду выполнения C Я не уверен, понял ли я то, что вы хотели здесь сказать, но вы, очевидно, можете статически связать среду выполнения C, как и любую другую библиотеку. - person Piotr Dobrogost; 09.01.2012
comment
Я пытался сказать, что большинство компиляторов в наши дни по умолчанию динамически связывают библиотеки. Я думаю, что Visual Studio все еще имеет возможность статически связываться со средой выполнения C, но не все компиляторы предоставят вам эту возможность. Даже если они это сделают, все равно будут некоторые библиотеки, в которых вы не получите эту возможность, если библиотека поставляется как DLL плюс библиотека импорта. - person Duncan; 09.01.2012
comment
@Duncan Я не специалист по C / C ++, но я почти уверен, что вы также можете статически связать с помощью GCC, и я не понимаю, почему это невозможно. - person Camilo Martin; 14.01.2013