免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13001 | 回复: 5
打印 上一主题 下一主题

请教下python怎么和C或者C++混合编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-12 22:00 |只看该作者 |倒序浏览
比如:
// a.py

def test(a,b)
      return a+b



怎么来混合编程列,
//c++

main()
{
    //  怎么写啊 ..

}


给个简单范例, 谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-08-13 08:59 |只看该作者
http://bbs.chinaunix.net/viewthread.php?tid=1197937

去看下我的回复把。呵呵

论坛徽章:
0
3 [报告]
发表于 2008-08-13 09:01 |只看该作者
网上找来的看下。。

附1 text.txt
this is test text in text.txt.
附2 mymod.py
import string
message = ''original string''
message =message+message
msg_error=""
try:
       text_file = open("text.txt", "r")
       whole_thing = text_file.read()
       print whole_thing
       text_file.close()
except IOError, (errno, strerror):
       print "I/O error(%s): %s" % (errno, strerror)
def transform(input):
    #input = string.replace(input, ''life'', ''Python'')
    return string.upper(input)
def change_msg(nul):   
    global message #如果没有此行,message是函数里头的局部变量
    message=''string changed''
    return message
def r_file(nul):
    return whole_thing
def get_msg(nul):
return message

附3 simplepy.h
using std::string;
class CSimplepy // : private noncopyable
{
public:
    ///constructor
    CSimplepy()
    {
        Py_Initialize();
        pstr=NULL, pmod=NULL, pdict=NULL;
        pfunc=NULL, pargs=NULL;
    }
    virtual ~CSimplepy()   
    {   
        Py_Finalize();
    }
    bool ImportModule(const char* mod_name)
    {
        try{
            pmod  = PyImport_ImportModule(const_cast(mod_name));
            if(pmod==NULL)
                return false;
            pdict = PyModule_GetDict(pmod);
        }
        catch(...)
        {
            return false;
        }
        if(pmod!=NULL && pdict!=NULL)
            return true;
        else
            return false;
    }
    int Run_SimpleString(const char* str)
    {
        return PyRun_SimpleString(const_cast(str) );
    }
    string Run_String(const char* str)
    {
        char *cstr;
        pstr  = PyRun_String(str, Py_eval_input, pdict, pdict);
        if(pstr==NULL)
            throw ("when Run_String, there is an exception was raised by Python environment.");
        PyArg_Parse(pstr, "s", &cstr);
        return string(cstr);
    }
    string CallObject(const char* func_name, const char* parameter)
    {
        pfunc=NULL;
        pfunc = PyObject_GetAttrString(pmod, const_cast(func_name));
        if(pfunc==NULL)
            throw (string("do not found in Python module for: ")
+func_name).c_str();
        char* cstr;
        pargs = Py_BuildValue("(s)", const_cast(parameter));
        pstr  = PyEval_CallObject(pfunc, pargs);
        if(pstr==NULL)
            throw ("when PyEval_CallObject, there is an exception was raised by Python environment");
        PyArg_Parse(pstr, "s", &cstr);      
        return string(cstr);
    }     
protected:
    PyObject *pstr, *pmod, *pdict;
    PyObject *pfunc, *pargs;
};

论坛徽章:
0
4 [报告]
发表于 2008-08-13 11:00 |只看该作者
原帖由 xiaoyu9805119 于 2008-8-13 08:59 发表
http://bbs.chinaunix.net/viewthread.php?tid=1197937

去看下我的回复把。呵呵




CSDN 小月了 ...  没办法看到你找的那个CSDN的链接..

另外我早上搜索了下 , 说可以利用pyrex 来实现 . 没测试过, 晚点我试试 ..

楼上的那个是利用python C++ API吧 ..

早上搜索到的资料:

转载:

//******************************
一般编写Python C/C++ Module,或者为C/C++ lib编写Wrapper,我所看到的有以下几种方式: 1. 直接使用C Python提供的API 2. SWIG 3. Boost.Python 4. Pyrex

首先直接使用Python C API是很不方便的。上面几位高人已经谈过了SWIG和Boost.Python,我就不多说了,只是个人感觉易用性而言Boost.Python > SWIG,但SWIG功能强大,支持的也不只是Python一种脚本语言。以上这两种方式对C++的支持都比较友好。

这里着重推荐一下Pyrex。 Pyrex 可以说是扩展Python的一大创新,她使用Python like的语法来编写Python的C Module,自动翻译成C语言代码,进而编译获取C 代码的高效率。而且,配合Python的Distutils,使得构建过程简单到了只需要setup.py的程度。我觉得其简化python扩展的编写方式,已经和Boost.python,SWIG不在一个意义级别上了。
//*********************************************************

论坛徽章:
0
5 [报告]
发表于 2008-08-13 11:08 |只看该作者
xiaoyu9805119
的链接。我给你弄来了。
里面是:

C/C++对Python的调用层次可以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的扩展(也就使向Python输出调用函数). 这里我主要讨论(1)(2)两种方法.
1 高层次的调用
这是最简单的一种在C/C++中调用Python的方法. 它直接的调用Python提供的C调用接口函数, 这些函数主要有: PyRun_SimpleString(), PyRun_SimpleStringFlags(), PyRun_SimpleFile(), PyRun_SimpleFileEx()和PyRun_SimpleFileExFlags()几个. 函数的具体用法参考Python的文档.
    这里举个例子来说明这种层次的用法:

由这个例子可见, 在C/C++中调用Python的内容非常简单, 只要构造一个简单的Python调用字符串.这里要注意的就是, Python调用串语句之间要用'\n'来分开, 且语句之间不能有空格, 如上面的Python字符串不能写成: "import sys\n print sys.path" , 否则要出错的.


// c/c++ 中 Python 调用必须的头文件
#include <;Python.h>

//
int main(int argc, char* argv[])
{
// 初始化Python解析环境
Py_Initialize();

// 构造Python执行脚本
char szPyScript[128];
sprintf(szPyScript, "import sys\nprint sys.path");
if(PyRun_SimpleString(szPyScript) != 0)
{
  sprintf(stderr, "execute \'%s\'failed!", szPyScript);
  return -1;
}

// 清除Python解析环境
Py_Finalize();
}

//



//
以上的例子也表明了在C/C++中调用Python的基本结构, 就是
(1) 先初始化Python环境然: Py_Initialize()
(2) 具体对Python的操作
(3) 清除Python环境

  更复杂的一个使用高层调用的例子, 这个例子用PyRun_SimpleFile的例子.

  这里值得注意是, 在Window中:
(1) 链接debug版本的时候会自动链接PythonXX(_d).lib库, PythonXX_d安装时是没有安装的, 所以要显示的指定链接PythonXX.lib库, 不知道VC6.0为什么还会去找PythonXX_d.lib, 在vs7.0不会.
(2) 编译时要以 /MD(多线程DLL) 选项编译(不论时debug版本还时release版本都一样).

以上我在VC7.0中可以正确的运行, 在VC6.0这样还不行, 可能和我使用的版本有关系(我用的版本是:Python24.lib).  

// c/c++ 中 Python 调用必须的头文件
#include <;Python.h>

//
int main(int argc, char* argv[])
{
// 初始化Python解析环境
Py_Initialize();

//
char szFile[] = "PyFile.py";
//sprintf(szPathFile, "%s\\%s", szPath, szFile);
FILE* fp = fopen(szFile, "r");
if(PyRun_SimpleFile(fp, szFile) != 0)
{
  fclose(fp);
  sprintf(stderr, "PyRun_SimpleFile(%s) failed!", saFile);
  return -1;
}
fclose(fp);

// 清除Python解析环境
Py_Finalize();
}




2 纯Python调用


[ 本帖最后由 9119111 于 2008-8-13 11:58 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-08-13 11:52 |只看该作者
昏,忘记CSDN不行了。

感谢楼上的,辛苦了!建议把表情去除。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP