如何使用distutils编译简单的python嵌入式程序

如何使用distutils编译简单的python嵌入式程序,python,visual-c++,compilation,Python,Visual C++,Compilation,这是我的密码: 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_Set

这是我的密码:

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"])
从distutils.msvc9compiler导入MSVCCompiler
target\u python\u file=“main.py”
ccode=“”#包括
int
main(int argc,char*argv[])
{
PyObject*PyFileObject;
putenv(“PYTHONPATH=lib”);
putenv(“PYTHONHOME=.”);
Py_SetProgramName(argv[0]);
Py_初始化();
PyFileObject=PyFile_FromString(“%s”、“r”);
PyRun_simplefilex(PyFile_AsFile(PyFileObject),“%s”,1);
Py_Finalize();
返回0;
}
“”“%(目标python文件,目标python文件)
以open(“main.c”、“w”)作为main:
main.write(ccode)
编译器=MSVCCompiler()
compiler.compile([“main.c”],includedirs=[“c:/Python27/include”])
compiler.link(“,[“main.obj”],“python_launcher.exe”,libraries=[“python27”],library_dirs=[“C:/python27/libs”])
当我运行此程序时,会出现
python_launcher.exe
,但是,当我尝试运行它时,会发现一个无效的win32应用程序错误

< >我可以使用VisualC++ 2008编译相同的代码,它是有效的,但是我想利用ditudil来实现这一点,因为我希望它能为编译器找出配置选项。 调试 我试图在WinDebug中打开创建的可执行文件,但无法打开,因为发生了以下情况:


土耳其部分表示它不是有效的Win32应用程序。

为使代码正常工作,对代码进行了两次修改:

  • 使用link\u executable输出一个独立的可执行文件(compile.link()是无用的,请改用子函数)

    此时,您应该会收到以下错误消息:

    X:\dev\null>python_launcher.exe 
    ImportError: No module named site
    
  • 这是因为您没有输入PYTHONPATH和PYTHONHOME变量env。在你的主要发言中,c:

  • 瓦伦夫:

    putenv("PYTHONPATH=C:/Python27/Lib");
    putenv("PYTHONHOME=C:/Python27");
    
  • 它应该可以与这些修复一起使用(在WindowsXPx86、Python2.7、VSExpress 2008上测试)

    整个代码:

    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"]) 
    
    从distutils.msvc9compiler导入MSVCCompiler
    target\u python\u file=“main.py”
    ccode=“”#包括
    int
    main(int argc,char*argv[])
    {
    PyObject*PyFileObject;
    putenv(“PYTHONPATH=C:/Python27/Lib”);
    putenv(“PYTHONHOME=C:/Python27”);
    Py_SetProgramName(argv[0]);
    Py_初始化();
    PyFileObject=PyFile_FromString(“%s”、“r”);
    PyRun_simplefilex(PyFile_AsFile(PyFileObject),“%s”,1);
    Py_Finalize();
    返回0;
    }
    “”“%(目标python文件,目标python文件)
    以open(“main.c”、“w”)作为main:
    main.write(ccode)
    编译器=MSVCCompiler()
    compiler.compile([“main.c”],includedirs=[“c:/Python27/include”])
    compiler.link_可执行文件([“main.obj”],“launch”,libraries=[“python27”],library_dirs=[“C:/python27/libs”])
    
    您得到的确切调用堆栈是什么?@Abhijit我无法获得堆栈跟踪。请参阅我的最新问题。
    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"])