找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3814|回复: 4

[求助] c调用python模块

1

主题

5

帖子

5

积分

贫民

积分
5
etangyushan 发表于 2014-6-14 09:48:09 | 显示全部楼层 |阅读模式
自己有form.py的python模块文件,现在写一个.c文件调用这个form .py中的函数。gcc编译完成后程序可以正常运行。现在我想把.c文件打成动态库libform.so,在其他的地方调用动态库,结果就提示找不到form.py这个文件.
form.py和libform.so已经拷贝到调用的目录下了。。。程序运行到pModule= PyImport_ImportModule("form"); 时返回的pModule是NULL
哪位大侠指点一下,怎么回事啊?


下面是调用python的模块的c语言函数,把这个函数打成的动态库。调用func()函数时出现的问题
int  func(char* filePath){       
        Py_Initialize();
        if(!Py_IsInitialized())
        {
                printf("initialize error\n");
                return -1;
        }

        PyRun_SimpleString("import sys");
         
        PyRun_SimpleString("sys.path.append('./')");   

        PyObject *pModule = NULL;
        PyObject *pFunc = NULL;
        PyObject *pArg = NULL;
        PyObject *presult = NULL;

        pModule= PyImport_ImportModule("form");
        if(!pModule)
        {
                perror("pModule");
        }
       
        pFunc = PyObject_GetAttrString(pModule, "formp");
        if(!pFunc)
        {
                perror("pFunc");
        }
       
        pArg = Py_BuildValue("(s)",filePath);
        if(!pArg)
        {
                perror("pArgp");
        }
        presult = PyEval_CallObject(pFunc, pArg);

        Py_Finalize();
        return 1;
}


回复

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
etangyushan  楼主| 发表于 2014-6-14 09:57:28 | 显示全部楼层
我把form.py拷贝到python的系统目录下面也不行
'/usr/lib64/python2.6',
'/usr/lib64/python2.6/site-packages',
'/usr/lib/python2.6/site-packages',、
不打成动态库就可以正常运行,但是打成动态库后就找不到form.py这个模块了
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
etangyushan  楼主| 发表于 2014-6-14 09:58:49 | 显示全部楼层
难道python不支持,c的动态库调用python模块吗???
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
etangyushan  楼主| 发表于 2014-6-14 21:20:06 | 显示全部楼层
没有人遇到这个情况吗???
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
etangyushan  楼主| 发表于 2014-6-14 21:47:04 | 显示全部楼层
找到问题的原因了,
举个例子:我的系统中的python版本是python2.6,
callpython.c 这个c程序中有调用python模块的函数,编译成libcallpy.so
main.c这个程序中使用dlopen()函数调用了libcallpy.so
那么在gcc main.c 的时候要加-lpython2.6这个选项,要不callpython.c中的
pModule= PyImport_ImportModule("form");这个加载python模块的函数会返回NULL
gcc main.c -lpython2.6
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表