È possibile compilare Python in modo nativo (oltre il codice byte pyc)?
-
03-07-2019 - |
Domanda
Mi chiedo se sia possibile creare un modulo eseguibile da uno script Python. Ho bisogno di avere le massime prestazioni e la flessibilità dello script Python, senza dover eseguire l'ambiente Python. Vorrei utilizzare questo codice per caricare moduli utente su richiesta per personalizzare la mia applicazione.
Soluzione
- C'è pyrex che compila python come sorgente in moduli di estensione python
- rpython che ti consente di compilare Python con alcune restrizioni per vari backend come C, LLVM, .Net ecc.
- C'è anche shed-skin che traduce Python in C ++, ma non posso dire se sia buono .
- PyPy implementa un compilatore JIT che tenta di ottimizzare il runtime di tradurre parti di ciò che è in esecuzione in fase di esecuzione in codice macchina, se si scrive per l'interprete PyPy che potrebbe essere un percorso fattibile.
- Lo stesso autore che sta lavorando su JIT in PyPy ha scritto psyco che precedentemente ottimizza il pitone nell'interprete CPython .
Altri suggerimenti
Puoi usare qualcosa come py2exe per compilare il tuo script Python in un exe o Freeze per un binario di Linux.
vedi: Come posso creare un'app GUI multipiattaforma direttamente eseguibile utilizzando Python?
Ho avuto molto successo usando Cython , che si basa e estende pyrex:
Cython è un linguaggio che rende scrivere estensioni C per Python linguaggio facile come Python stesso. Cython si basa sul noto Pyrex, ma supporta più taglienti funzionalità e ottimizzazioni.
Il linguaggio Cython è molto vicino il linguaggio Python, ma Cython supporta inoltre la chiamata C funzioni e dichiarazione di tipi C attivati variabili e attributi di classe. Questo consente al compilatore di generare molto codice C efficiente dal codice Cython.
Questo rende Cython il linguaggio ideale per il wrapping per librerie C esterne, e per moduli C veloci che accelerano l'esecuzione del codice Python.
Penso che puoi usare jython per compilare python in bytecode Java, e poi compilarlo con GCJ.