我根据文档使用嵌入式Python for C时遇到问题- 每当我尝试使用导入的模块时,我得到一个:
PythonIncl.exe中0x1e089e85处的未处理异常:0xC0000005:访问冲突读取位置0x00000004.
该PyObject_GetAttrString()方法中出现错误,文档没有太大帮助.我也尝试过使用IBM的一个示例中的教程,但总是得到相同的访问冲突.
以下是我似乎无法开始工作的其中一个教程的示例代码,这里有什么问题?
C代码(在一个主文件中):
#include <Python.h>
int main()
{
PyObject *strret, *mymod, *strfunc, *strargs;
char *cstrret;
Py_Initialize();
mymod = PyImport_ImportModule("reverse");
strfunc = PyObject_GetAttrString(mymod, "rstring");
strargs = Py_BuildValue("(s)", "Hello World");
strret = PyEval_CallObject(strfunc, strargs);
PyArg_Parse(strret, "s", &cstrret);
printf("Reversed string: %s\n", cstrret);
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Python代码(在一个名为reverse.py的文件中,相同的文件夹):
def rstring(s):
i = len(s)-1
t = ''
while(i > -1):
t += s[i]
i -= 1
return t
Run Code Online (Sandbox Code Playgroud)
我正在使用MSVS2008,Python 2.7运行XP机器
一点上下文:我试图在一个相当大的C程序中嵌入一个使用OpenOPC的小python脚本,并希望在两者之间传输数据.但是,我已经通过基本示例进行了概念验证测试.
我试图从C代码调用python函数,我从这里跟随一个示例
我也有正确的包含文件目录,库目录,并链接python32.lib(即时使用python 32)但是错误是python/C API,如PyString_FromString,PyInt_FromLong,PyInt_AsLong未定义(调试器中的错误)
这很奇怪,因为我也使用其他API,但它们都很好......
这是什么问题?
int
main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
int i;
if (argc < 3) {
fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
return 1;
}
Py_Initialize();
pName = PyString_FromString(argv[1]);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pDict = PyModule_GetDict(pModule);
/* pDict is a borrowed reference */
Run Code Online (Sandbox Code Playgroud)
Py_Initialize(),PyImport_Import(),PyModule_GetDict()一切正常,但不是PyString_FromString ......
我想将Python解释器嵌入到Qt 5应用程序中.
我在Qt 5中有一个工作应用程序,但是当我放入时
#include <Python.h>
Run Code Online (Sandbox Code Playgroud)
在顶部(Qt标题下方)编译中断
../sample/python3.3m/object.h:432:23: error: expected member name or ';' after declaration specifiers
PyType_Slot *slots; /* terminated by slot==0. */
~~~~~~~~~~~ ^
Run Code Online (Sandbox Code Playgroud)
当我将Python标题放在Qt标题之上时,它会破坏
In file included from ../Qt5.0.1/5.0.1/clang_64/include/QtGui/QtGui:59:
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:63:57: error: expected '}'
A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1,
^
/usr/include/sys/termios.h:293:12: note: expanded from macro 'B0'
#define B0 0
^
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:62:19: note: to match this '{'
enum PageSize { A4, B5, Letter, Legal, Executive,
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
拜托,有谁知道为什么会这样?我可能是因为Qt和Python定义了一些常用词?我能做些什么呢?
我正在尝试在我的C应用程序中嵌入一个Python(2.7)库,我正在使用Python/C API从C调用Python代码.我需要调用一个接受关键字参数的Python方法.在语义上,我正在尝试在Python中实现以下行的等价物:
myobject.dosomething('blahdy blah', somearg=True)
Run Code Online (Sandbox Code Playgroud)
通过阅读文档,我已设法获得以下内容,但这不会传递关键字参数:
PyObject_CallMethod(myobject, "dosomething", "s", "blahdy blah");
Run Code Online (Sandbox Code Playgroud)
我对Python并不是很熟悉,因为文档在这方面并不完全清楚,而且谷歌搜索也没有提供太多有用的信息.我很感激任何帮助.
是否可以在没有标准库的情况下嵌入python?
我正在使用python 2.7.6的cmake构建,我已经运行了一个基本的嵌入式脚本,如下所示:
#include <stdio.h>
#include <Python.h>
int main(int argc, char *argv[]) {
/* Setup */
Py_SetProgramName(argv[0]);
Py_Initialize();
/* Run the 'main' module */
int rtn = Py_Main(argc, _argv);
Py_Finalize();
return rtn;
}
Run Code Online (Sandbox Code Playgroud)
..但是当我运行它时,我得到:
ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)
如果我设置了正确的$ PYTHONHOME,它可以正常工作; 但这不是我想要做的.我试图在没有标准库的独立应用程序中嵌入python的副本.
我很欣赏它的使用,但对于这个特定的嵌入式环境,我想要更像lua的东西(但显然有python语法),其中只有父应用程序公开的特定库可用.
这还有一个额外的好处,即不关心分发(或构建)标准库及其所有交叉链接的动态库.
这有可能吗?或者我不可避免地会发现缺少语言的基本块,如sys.path,import,{},[]或类似标准库的一部分?
如果有可能,你会怎么做呢?
我的项目结构如下所示:
emb
| CMakeLists.txt
| main.c
| python35.lib
| stdlib.zip
| _tkinter.pyd
|
+---include
| |
| | abstract.h
| | accu.h
| | asdl.h
...
| | warnings.h
| | weakrefobject.h
|
+---build
| | emb.exe
Run Code Online (Sandbox Code Playgroud)
stdlib.zip包含Python 3.5.2安装中的DLL,Lib和site-packages目录,其路径被追加到sys.path.我通过链接到python35.lib隐式加载python35.dll,python35.lib包含DLL中所有导出函数的存根.这是CMakeLists.txt的内容:
cmake_minimum_required(VERSION 3.6)
project(embpython)
set(SOURCE_FILES main.c)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
set(PYTHON_INCLUDE_DIR include)
include_directories(${PYTHON_INCLUDE_DIR})
target_link_libraries(
${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/python35.lib
${CMAKE_CURRENT_LIST_DIR}/_tkinter.pyd)
Run Code Online (Sandbox Code Playgroud)
这是main.c的内容:
#include <Python.h>
int main(int argc, char** argv) …Run Code Online (Sandbox Code Playgroud) 我试图使用嵌入在C++程序中的Python 3.5解释器从C++接收图像,并将其用作我训练的张量流模型的输入.首先,我将我的图像转换为numpy数组,然后将其发送到python.这是我的简化代码,工作正常(从这里采用的代码):
Python代码:
def multiply_fun(M):
V = M*2
print(V)
Run Code Online (Sandbox Code Playgroud)
调用上述函数的我的C++代码:
#include <Python.h>
#include <abstract.h>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <ndarrayobject.h>
#include <vector>
int main()
{
Py_InitializeEx(1);
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* curDir = PyUnicode_FromString(".");
PyList_Append(sysPath, curDir);
Py_DECREF(curDir);
PyObject* python_code = PyImport_ImportModule("python_code");
PyObject* multiply_fun = PyObject_GetAttrString(python_code, "multiply_fun");
Py_XDECREF(python_code);
import_array1(-1);
npy_intp dim[] = { 5, 5 };
std::vector<double> buffer(5*5, 1);
PyObject* array_2d = PyArray_SimpleNewFromData(2, dim, NPY_DOUBLE, &buffer[0]);
PyObject* return_value1 = PyObject_CallFunction(multiply_fun, "O", array_2d);
Py_XDECREF(return_value1);
Py_XDECREF(array_2d);
Py_XDECREF(multiply_fun);
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我想使用大多数python库时,我收到一个错误.例如,对于这个python代码: …
以下是在C/C++中扩展嵌入式Python 3.x的程序的规范示例:
#include <Python.h>
//// Definition of 'emb' Python module ////////////////////
static PyObject* emb_foo(PyObject *self, PyObject *args)
{
char const* n = "I am foo";
return Py_BuildValue("s", n);
}
static PyMethodDef EmbMethods[] = {
{"foo", emb_foo, METH_VARARGS, "Returns foo"},
{NULL, NULL, 0, NULL}
};
static PyModuleDef EmbModule = {
PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
return PyModule_Create(&EmbModule);
}
//// Embedded Python with 'emb' loaded ////////////////////
int main()
{
PyImport_AppendInittab("emb", &PyInit_emb); …Run Code Online (Sandbox Code Playgroud) 本学期,我正在将压缩感知算法实现为iPhone应用程序.为此,我需要一些好的矩阵/线性代数库.我对iOS和Python都有点新意,我正在寻找一些帮助来评估我的选择.
我知道iPhone有Accelerate框架,其中包括vecLib,BLAS和LAPACK,但我不熟悉它们的API(它们看起来相当令人困惑).
我玩过Python/numpy,我真的很喜欢它的使用方式 - 如果我有选择的话,我宁愿使用numpy over Accelerate.
我知道嵌入Python是可能的,但我自己也没有运气.我试图在一个XCode项目中包含Enthought的EPD.framework,但是在玩了一个小时左右之后没有让它工作.我认为编译numpy会更糟.
作为另一种选择,我可以使用Cython(http://cython.org/)生成C文件然后从中调用函数吗?我也试过这个,但是遇到了包含.so库并调用它的更多问题.有没有办法让Cython生成.c和.h文件?会说.c和.h文件仍然依赖于numpy?
我已经阅读了一些关于PyInstaller和freeze.py的内容.这些可以帮助我吗?
除了Accelerate或Python + numpy之外还有其他选择吗?Python + numpy是一个不错的选择,还是很难编译/构建?Cython是一个有效的解决方案吗?
谢谢!
I am embedding Python in a C++ application and I also need to call back in to the C++ code from Python. I have been able to do this with the following simple example but I'm having a weird problem in my C++ application.
Module definitions...
static PyObject*
say_hello(PyObject* self, PyObject* args)
{
const char* name;
if (!PyArg_ParseTuple(args, "s", &name))
return NULL;
printf("Hello %s!\n", name);
Py_RETURN_NONE;
}
static PyMethodDef HelloMethods[] =
{
{ "say_hello", say_hello, METH_VARARGS, "Greet somebody." },
{ …Run Code Online (Sandbox Code Playgroud) python-embedding ×10
python ×9
python-c-api ×6
c ×3
c++ ×3
import ×1
iphone ×1
numpy ×1
python-2.7 ×1
python-3.5 ×1
qt ×1
tkinter ×1
windows ×1