2014-01-06 4 views
7

Ist es möglich, Python ohne die Standardbibliothek einzubetten?Ist es möglich, Python ohne die Standardbibliothek einzubetten?

Ich arbeite mit einem cmake build for python 2.7.6 und ich habe eine grundlegende eingebettete Script ausgeführt wird, bekam etwa so:

#include <stdio.h> 
#include <Python.h> 

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, _argv); 
    Py_Finalize(); 

    return rtn; 
} 

..aber wenn ich es benutze, erhalte ich:

ImportError: No module named site 

Wenn ich ein korrektes $ PYTHONHOME einstelle, funktioniert es gut; aber das versuche ich nicht. Ich versuche, eine Kopie von Python in eine eigenständige Anwendung ohne die Standardbibliothek einzubetten.

Ich schätze die Verwendung von es, aber für diese spezifische eingebettete Umgebung möchte ich etwas mehr wie lua, (aber mit Python-Syntax offensichtlich), wo nur die spezifischen Bibliotheken zur Verfügung gestellt von der übergeordneten Anwendung verfügbar sind.

Dies hat den zusätzlichen Vorteil, dass es nicht darum geht, die Standardbibliothek mit all ihren vernetzten dynamischen Bibliotheken zu verteilen (oder zu bauen).

Ist das alles möglich? Oder stolpere ich unweigerlich in fehlende Grundblöcke der Sprache wie sys.path, import, {}, [] o.ä., die Teil der Standardbibliothek sind?

Wenn es möglich ist, wie würdest du es tun?

+2

Warum stellen Sie nicht Ihre eigene minimale "Standardbibliothek" zur Verfügung? Schließen Sie nur 'site.py' ein, alles, was' site.py' benötigt, und alles, was Ihre Anwendung benötigt? –

+2

Aber, ja, die CPython-Implementierung erfordert, dass bestimmte Module vorhanden und importierbar sind. In Python 3 beinhaltet das die Import-Maschinerie. 'sys' ist ein eingebautes Modul, Syntax wird nie importiert, aber ein Teil der Sprache, so dass' {} 'und' [] 'nicht zerbrechen. –

+0

Ich habe darüber nachgedacht, aber es ist ein wenig nervig, eine Binärdatei mit einer zu versenden.PY-Datei; Ich dachte vielleicht daran, den Importmechanismus zu hacken, wie es kivy für sein kivy-ios-Projekt tut, und die minimal erforderlichen Module einzubauen sind rohe Textblobs, aber ich bin mir nicht sicher, wie ich diesen Pfad weitermachen soll. – Doug

Antwort

11

Einfache Antwort ist ja können Sie.

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_NoSiteFlag = 1; // <--- This 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, argv); 
    Py_Finalize(); 

    return rtn; 
} 

Soweit ich sagen kann, nichts bricht und man kann alles weiterverwenden (einschließlich der Möglichkeit, Module ~ importieren) völlig in Ordnung. Wenn Sie versuchen, etwas aus der Standardbibliothek zu importieren, die nicht gebündelt wird, erhalten Sie:

>>> import os; 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named os 

ich eine Kopie des Codes für alle hier oben verlassen werden, die daran interessiert sind;

https://github.com/shadowmint/cmake-python-embed-nostdlib

+1

Das Importieren von 'site.py' sollte vermeidbar sein, ohne den Interpreter zu verändern, denke ich. Die Haupt-ausführbare Datei vermeidet dies, wenn sie das Flag "-S" erhält. Sie müssten prüfen, ob das entsprechende Flag ('Py_NoSiteFlag') intern oder privat ist. Alternativ fügen Sie Ihrem eingebetteten Build ein dummy 'site'-Modul hinzu. Beide Optionen scheinen besser zu sein als ein separater Patch, auch wenn es so einfach und unwahrscheinlich ist, dass es bricht. – delnan

+0

@delnan Sie sind völlig richtig! Vielen Dank! Ich habe meine Antwort aktualisiert, um das Py_NoSiteFlag zu verwenden, das ist definitiv eine bessere Lösung. – Doug

+1

Dies scheint für Python3 nicht ausreichend zu sein: http://stackoverflow.com/questions/34724057/embed-python3-without-standard-library –

1

AFAIK, können Sie nicht. Ohne die Standardbibliothek wird Python nicht einmal gestartet, da es versucht, os.py (in 3.x; string.py in 2.x) zu finden. Beim Start importiert es eine Reihe von Modulen, insbesondere site.py. Sie benötigen mindestens pythonxy.dll und wahrscheinlich den Inhalt des lib-Ordners sowie die Erweiterungsmodule, d. H. Den Inhalt des DLLs-Ordners.

Sie können es mit einer Datei pythonXX.zip (wobei XX die Versionsnummer wie 27 oder 33 ist), die eine gezippte Kopie der Standardbibliothek sein soll. Sie können die Bibliothek von Dingen befreien, die Sie nicht brauchen; Es gibt verschiedene Tools, die Abhängigkeiten statisch berechnen (siehe modulefinder).

Ich denke, deshalb ist Lua beliebter als eine eingebettete Skriptsprache.

Verwandte Themen