【问题标题】:How to compile simple python embeded program using distutils如何使用 distutils 编译简单的 Python 嵌入式程序
【发布时间】:2013-10-12 09:48:53
【问题描述】:

这是我的代码:

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"])

当我运行它时,会出现python_launcher.exe,但是,当我尝试运行它时,我得到一个无效的 win32 应用程序错误。

我可以使用 visaul c++ 2008 编译相同的代码并且它可以工作,但我想为此使用 distutils,因为我希望它找出编译器的配置选项。

调试

我尝试在 WinDebug 中打开创建的可执行文件,但无法打开,因为发生了以下情况:

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

【问题讨论】:

  • 你得到的确切调用堆栈是什么?
  • @Abhijit 我无法获得堆栈跟踪。查看我更新的问题。

标签: python visual-c++ compilation


【解决方案1】:

对您的代码进行两项修改以使其正常工作:

  1. 使用link_executable 输出一个独立的可执行文件(compile.link() 没用,改用子函数)。

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

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

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

那是因为你没有输入 PYTHONPATH 和 PYTHONHOME 变量 env。在你的 main.c 中:

  1. VARENV:

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

它应该适用于这些修复(在 Windows XP x86、Python 2.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"]) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多