2016-04-21 5 views
3

Ich verwende einen eingebetteten Python 2.7 Interpreter in meinem C++ Projekt, und ich möchte den Interpreter so viel wie möglich optimieren. Eine Möglichkeit, dies zu tun, besteht darin, meine Debug-Anweisungen mit der __debug__-Variable zu deaktivieren. Ich möchte auch mögliche Leistungssteigerungen aufgrund der Ausführung von Python mit Bytecode-Optimierungen (d. H. Dem -O-Flag) erkennen.Wie kann ich einen eingebetteten Python-Interpreter mit Bytecode-Optimierung aus C++ initialisieren?

This Stack Overflow question Adressen die Verwendung der __debug__ Variable, und stellt fest, dass es durch Ausführen von Python mit -O deaktiviert werden kann. Dieses Flag kann jedoch offensichtlich nicht für einen eingebetteten Interpreter übergeben werden, der mit C++ - Hooks erstellt wird.

Unten ist mein eingebetteter Interpreter-Initialisierungscode. Der Code soll nicht isoliert ausgeführt werden, sondern sollte einen Einblick in die Umgebung geben, die ich verwende. Gibt es eine Möglichkeit, diese Funktionsaufrufe zu ändern oder zu ergänzen, um festzulegen, dass der eingebettete Interpreter Bytecode-Optimierungen anwenden soll, die Variable __debug__ auf False setzen und im Allgemeinen im "release" -Modus statt im "debug" -Modus laufen soll?

void PythonInterface::GlobalInit() { 
    if(GLOBAL_INITIALIZED) return; 
    PY_MUTEX.lock(); 
    const char *chome = getenv("NAO_HOME"); 
    const char *cuser = getenv("USER"); 
    string home = chome ? chome : "", user = cuser ? cuser : ""; 
    if(user == "nao") { 
    std::string scriptPath = "/home/nao/python:"; 
    std::string swigPath = SWIG_MODULE_DIR ":"; 
    std::string corePath = "/usr/lib/python2.7:"; 
    std::string modulePath = "/lib/python2.7"; 
    setenv("PYTHONPATH", (scriptPath + swigPath + corePath + modulePath).c_str(), 1); 
    setenv("PYTHONHOME", "/usr", 1); 
    } else { 
    std::string scriptPath = home + "/core/python:"; 
    std::string swigPath = SWIG_MODULE_DIR; 
    setenv("PYTHONPATH", (scriptPath + swigPath).c_str(), 1); 
    } 

    printf("Starting initialization of Python version %s\n", Py_GetVersion()); 
    Py_InitializeEx(0); // InitializeEx(0) turns off signal hooks so ctrl c still works 
    GLOBAL_INITIALIZED = true; 
    PY_MUTEX.unlock(); 
} 

void PythonInterface::Init(VisionCore* core) { 
    GlobalInit(); 
    PY_MUTEX.lock(); 
    CORE_MUTEX.lock(); 
    CORE_INSTANCE = core; 
    thread_ = Py_NewInterpreter(); 
    PyRun_SimpleString(
    "import pythonswig_module\n" 
    "pythonC = pythonswig_module.PythonInterface().CORE_INSTANCE.interpreter_\n" 
    "pythonC.is_ok_ = False\n" 
    "from init import *\n" 
    "init()\n" 
    "pythonC.is_ok_ = True\n" 
); 
    CORE_MUTEX.unlock(); 
    PY_MUTEX.unlock(); 
} 

Antwort

1

Ich löste dies durch die PYTHONOPTIMIZE Umgebungsvariable vor Py_InitializeEx(0) dem Aufruf:

/* ... snip ... */ 
setenv("PYTHONOPTIMIZE", "yes", 0); 
printf("Starting initialization of Python version %s\n", Py_GetVersion()); 
Py_InitializeEx(0); // InitializeEx(0) turns off signal hooks so ctrl c still works 
/* ... snip ... */ 
Verwandte Themen