标签: python-embedding

将Python嵌入C - 导入模块

我根据文档使用嵌入式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 python-embedding python-c-api

7
推荐指数
1
解决办法
8140
查看次数

嵌入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 ......

c python python-embedding python-c-api

7
推荐指数
1
解决办法
6889
查看次数

在Qt 5中嵌入Python

我想将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定义了一些常用词?我能做些什么呢?

python qt compiler-errors python-embedding

7
推荐指数
2
解决办法
2794
查看次数

带有关键字参数的PyObject_CallMethod

我正在尝试在我的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-embedding python-c-api python-2.7

7
推荐指数
2
解决办法
3966
查看次数

是否可以在没有标准库的情况下嵌入python?

是否可以在没有标准库的情况下嵌入python?

我正在使用python 2.7.6cmake构建,我已经运行了一个基本的嵌入式脚本,如下所示:

#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,{},[]或类似标准库的一部分?

如果有可能,你会怎么做呢?

python python-embedding

7
推荐指数
1
解决办法
1828
查看次数

在Windows上使用tkinter支持嵌入Python 3.5

我的项目结构如下所示:

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,Libsite-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 windows tkinter python-embedding python-3.5

7
推荐指数
1
解决办法
1399
查看次数

c ++中的嵌入式python代码 - 导入python库时出错

我试图使用嵌入在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++ python python-embedding python-c-api

7
推荐指数
1
解决办法
1397
查看次数

PyImport_ImportModule和import语句加载到不同的命名空间?

以下是在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)

c++ python import python-embedding python-c-api

6
推荐指数
1
解决办法
4459
查看次数

iPhone上的线性代数(python/numpy?)

本学期,我正在将压缩感知算法实现为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是一个有效的解决方案吗?

谢谢!

python iphone numpy python-embedding accelerate-framework

6
推荐指数
1
解决办法
2950
查看次数

Extending and Embedding Python in C++: Is PyImport_AddModule required to import extension module before importing python script?

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)

c++ python python-embedding python-c-api

6
推荐指数
0
解决办法
1265
查看次数