C++ 中的 Python 代码

Posted

技术标签:

【中文标题】C++ 中的 Python 代码【英文标题】:Python code in C++ 【发布时间】:2012-11-26 17:19:29 【问题描述】:

我想在我的 C++ 框架中使用一些 Python 代码来绘制一些统计数据。我已经找到了以下帖子(关于如何在 c++ 中嵌入 python),但按照说明操作并没有成功:Embed python code in C++ (Windows + minGW + Python 2.7.2 + Eclipse)

#include "Python.h"
int main(int f_argc, const char* f_argv [])

    Py_Initialize();
    const char* pythonScript = "print 'Hello, world!'\n";
    int result = PyRun_SimpleString(pythonScript);
    Py_Finalize();
    return 0;

很抱歉,我在制作文件或附加静态或动态库方面没有太多经验......

我必须遵循系统: 适用于 C/C++ 开发人员的 Windows 7 + 64 位 + Eclipse IDE,版本:Juno Service Release 1 + mingw + python32

在路径和符号下: + 添加python32的include目录 + 添加了对应于 libpython32.a 的库“python32” + 添加库路径

编译和链接似乎可以工作,但是当我尝试启动 exe 时,我收到以下消息:

“程序无法启动,因为您的计算机中缺少 python32.dll。请尝试重新安装程序以解决此问题。”

我无法理解此消息,因为我尝试将静态库 (libpython32.a) 添加到源。你能在正确的方向轻轻推动我吗?

非常感谢您的帮助!

编辑: 添加了makefile和objects.mk

制作文件 ################################################## ############################## # 自动生成的文件。不要编辑! ################################################## ##############################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables 

# All Target
all: Sandbox.exe

# Tool invocations
Sandbox.exe: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: Cross G++ Linker'
g++ -L"C:\Python32\libs" -o "Sandbox.exe" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '

# Other Targets
clean:
-$(RM)     $(C++_DEPS)$(OBJS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) Sandbox.exe
-@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

对象.MK

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

USER_OBJS :=

LIBS := -lgdi32 -ljpeg-8 -ltiff-5 -lpython32

【问题讨论】:

BTW 另请考虑相反的情况:将您的 C++ 统计代码转换为 Python 模块。 SWIG 会让您更轻松。 见Embedding Python on Windows: why does it have to be a DLL? 【参考方案1】:

在 Windows 上,程序搜索路径和共享库搜索路径由相同的环境变量 PATH 控制。要嵌入 Python,您需要将包含 python32.dll 的目录(通常为 c:\python3.2)放在您的 PATH 上。

如何在 Windows 上更改 PATH 的说明很容易在 Google 上搜索到;例如,请参阅 this videocast,它解释了运行 Python 的过程,或 this SO answer,解释了 Ruby 的过程。

在 Windows 上运行 Python 也包含在 the Python on Windows FAQ.

【讨论】:

【参考方案2】:

你看到的静态库(libpython32.a)不是真正的静态库,它只包含python32.dll的定义。所以它只不过是 python32.dll 的包装器。

您必须在您的 Windows PATH 中添加 python 安装文件夹,以便 Windows 可以自己找到该 dll。

【讨论】:

以上是关于C++ 中的 Python 代码的主要内容,如果未能解决你的问题,请参考以下文章

SWIG - python 中的 C++ 代码

PySide 中的多线程提升 Python C++ 代码

如何将 Python 中的脚本转换为 C++?

从 python 调试 VS2010 中的 c++ dll

尝试在 Python 中重写 C++ 代码时出现问题:删除地图中的项目和“vector.erase(vector.end())”

boost::python - C++ 调用 Python 调用 C++