2013-10-12 4 views
6

Ecco il mio codice:Come compilare semplice programma embeded Python usando distutils

from distutils.msvc9compiler import MSVCCompiler 

target_python_file = "main.py" 
ccode = """#include <Python.h> 

int 
main(int argc, char *argv[]) 
{ 
    PyObject* PyFileObject; 
    putenv("PYTHONPATH=lib"); 
    putenv("PYTHONHOME=."); 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 
    PyFileObject = PyFile_FromString("%s", "r"); 
    PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "%s", 1); 
    Py_Finalize(); 
    return 0; 
} 
""" % (target_python_file, target_python_file) 

with open("main.c","w") as main: 
    main.write(ccode) 

compiler = MSVCCompiler() 
compiler.compile(["main.c"],include_dirs=["C:/Python27/include"]) 
compiler.link("",["main.obj"],"python_launcher.exe",libraries=["python27"], library_dirs=["C:/Python27/libs"]) 

Quando eseguo questo, python_launcher.exe appare, tuttavia, quando provo a farlo funzionare, io non ottengo un errore di un'applicazione di Win32 valida.

Posso compilare lo stesso codice utilizzando visaul C++ 2008 e funziona, ma voglio utilizzare distutils per questo, perché voglio capire le opzioni di configurazione per il compilatore.

Debug

ho provato ad aprire creato eseguibile in WINDEBUG, ma non riuscivo ad aprire, perché questo è accaduto: enter image description here

parte turca dice che non è un'applicazione di Win32 valida.

+0

Qual è lo stack di chiamate esatte che si ottiene? – Abhijit

+0

@Abhijit Non riesco a ottenere una traccia dello stack. Vedi il mio quesiton aggiornato. – yasar

risposta

0

ci sono due modifiche al codice per farlo funzionare:

  1. Usa link_executable per produrre un eseguibile standalone (l'compile.link() è inutile, utilizzare le funzioni parziali, invece).

    compiler.link_executable(["main.obj"], #object 
              "launch" , # strip the .exe extension, it will be added 
              libraries=["python27"], 
              library_dirs=["C:/Python27/libs"] 
             )    
    

    A questo punto si dovrebbe ottenere questo messaggio di errore:

    X:\dev\null>python_launcher.exe 
    ImportError: No module named site 
    

Ecco perché non hai inserito il PYTHONPATH e PYTHONHOME ENV variabile. in main.c:

  1. VARENV:

    putenv("PYTHONPATH=C:/Python27/Lib"); 
    putenv("PYTHONHOME=C:/Python27"); 
    

Dovrebbe funzionare con le correzioni (testato su Windows XP x86, Python 2.7, VSExpress 2008)

L'intera codice:

from distutils.msvc9compiler import MSVCCompiler 

target_python_file = "main.py" 
ccode = """#include <Python.h> 

int 
main(int argc, char *argv[]) 
{ 
    PyObject* PyFileObject; 
    putenv("PYTHONPATH=C:/Python27/Lib"); 
    putenv("PYTHONHOME=C:/Python27"); 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 
    PyFileObject = PyFile_FromString("%s", "r"); 
    PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "%s", 1); 
    Py_Finalize(); 
    return 0; 
} 
""" % (target_python_file, target_python_file) 

with open("main.c","w") as main: 
    main.write(ccode) 

compiler = MSVCCompiler() 
compiler.compile(["main.c"],include_dirs=["C:/Python27/include"]) 
compiler.link_executable(["main.obj"],"launch", libraries=["python27"], library_dirs=["C:/Python27/libs"])