yas*_*sar 6 python compilation visual-c++
这是我的代码:
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"])
Run Code Online (Sandbox Code Playgroud)
python_launcher.exe然而,当我运行它时,出现,当我尝试运行它时,我得不到有效的win32应用程序错误.
我可以使用visaul c ++ 2008编译相同的代码并且它可以工作,但我想为此使用distutils,因为我希望它能找出编译器的配置选项.
我试图在WinDebug中打开创建的可执行文件,但我无法打开,因为这发生了:

土耳其语部分表示它不是有效的Win32应用程序.
对您的代码进行两处修改才能使其正常工作:
使用 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"]
)
Run Code Online (Sandbox Code Playgroud)
此时您应该收到此错误消息:
X:\dev\null>python_launcher.exe
ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)那是因为你没有输入 PYTHONPATH 和 PYTHONHOME 变量 env。在你的 main.c 中:
瓦伦夫:
putenv("PYTHONPATH=C:/Python27/Lib");
putenv("PYTHONHOME=C:/Python27");
Run Code Online (Sandbox Code Playgroud)它应该适用于这些修复(在 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"])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |