首页 > 编程知识 正文

vc调用python程序(vc code怎么运行Python)

时间:2023-11-29 19:12:35 阅读:310288 作者:KTOS

本文目录一览:

  • 1、如何发布vc调用Python的独立运行的程序
  • 2、求助 关于c程序中嵌入Python的问题
  • 3、vc 中如何运行
  • 4、python可以包vc程序嘛
  • 5、c++调用python
  • 6、vc++调用python传递参数

如何发布vc调用Python的独立运行的程序

译Python脚本生成可执行程序,可以通过py2exe编译完成。

在VC中调用python时,可以结合py2exe,完成整个程序的独立发布

google.py:

#! /usr/bin/env python

import sys, webbrowser

def main(a):

url = "" % a

webbrowser.open(url)

求助 关于c程序中嵌入Python的问题

在C/C++中嵌入Python也比较简单,首先需要在VC中添加Python的include文件目录和lib文件目录:

VC6.0下,打开 tools-options-directories-show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将libs目录添加到library files项中。

VC2005下,打开tools-options-项目和解决方案-VC++目录,然后做相同工作。

代码如下:

//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成

#include python.h

int main()

{

Py_Initialize();

PyRun_SimpleString("Print 'hi, python!'");

Py_Finalize();

return 0;

}

Py_Initialize函数原型是:void Py_Initialize(),在嵌入Python脚本时必须使用该函数,它初始化Python解释器,在使用其他的Python/C API之前必须先调用该函数。可以使用Py_IsInitialized函数判断是否初始化成功,成功返回True。

PyRun_SimpleString函数原型是int PyRun_SimpleString(const char *command),用来执行一段Python代码。注意:是否需要维持语句间的缩进呢?

Py_Finalize函数原型是void Py_Finalize(),用于关闭Python解释器,释放解释器所占用的资源。

PyRun_SimpleFile函数可以用来运行".py"脚本文件,函数原型如下:

int PyRun_SimpleFile(FILE *fp, const char *filename);

其 中fp是打开的文件指针,filename是要运行的python脚本文件名。但是由于该函数官方发布的是由visual studio 2003.NET编译的,如果使用其他版本的编译器,FILE定义可能由于版本原因导致崩溃。同时,为简便起见可以使用如下方式来代替该函数:

PyRun_SimpleString("execfile(‘file.py’)"); //使用execfile来运行python文件

Py_BuildValue()用于对数字和字符串进行转换处理,变成Python中相应的数据类型(在C语言中,所有Python类型都被声明为PyObject类型),函数原型如下:

PyObject *Py_BuildValue(const char *format, …..);

PyString_String()用于将PyObject*类型的变量转换成C语言可以处理的char*型,具体原型如下:

char* PyString_String(PyObject *p);

列表操作函数:

PyObject * PyList_New(Py_ssize_t len);

int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);

PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);

int PyList_Append(PyObject *list, PyObject *item);

int PyList_Sort(PyObject *list);

int PyList_Reverse(PyObject *list);

Py_ssize_t PyList_Size(PyObject *list);

元组操作函数:

int PyTuple_New(Py_ssize_t len);

int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);

PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);

int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //注意是**指针

字典操作函数:

PyObject * PyDict_New();

int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);

int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);

PyObject* PyDict_GetItem(PyObject *p, PyObject *key);

PyObject* PyDict_GetItemString(PyObject *p, const char *key);

//与PyDict_SetItemString对应

int PyDict_DelItem(PyObject *p, PyObject *key);

int PyDict_DelItemString(PyObject *p, char *key);

//与PyDict_SetItemString对应

int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);

PyObject* PyDict_Items(PyObject *p);

PyObject* PyDict_keys(PyObject *p);

PyObject* PyDict_Values(PyObject *p);

在C/C++中使用Python对象应正确地处理引用计数问题,否则容易导致内存泄漏。当使用Python/C API中的函数创建列表、元组、字典等后,在对其完成操作后应该使用Py_CLEAR()和Py_DECREF()等宏来销毁这些对象。原型如下:

void Py_CLEAR(PyObject *o);

void Py_DECREF(PyObject *o);

其中,对于Py_CLEAR函数,参数可以为NULL指针,表示不进行任何操作,但是Py_DECREF函数不能为NULL指针,否则导致错误。

使用PyImport_Import()函数可以在C中导入Python模块,返回一个模块对象。函数原型为:

PyObject* PyImport_Import(PyObject *name);

PyModule_GetDict()函数可以获得Python模块中的函数列表,返回一个字典,字典中的关键字为函数名,值为函数的调用地址。原型如下:

PyObject* PyModule_GetDict(PyObject *module);

使用PyObject_CallObject()函数和PyObject_CallFunction()函数可以在C中调用Python中的函数,原型如下:

PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);

//args是元组形式

PyObject* PyObject_CallFunction(PyObject *callable, char *format, ……);

//format是类似”iss”这样的参数类型,后面是指定参数

可以使用PyCallable_Check(func)来判断是否可以调用函数,可以则返回True。

vc 中如何运行

在VC中编译、运行程序的小知识点

VC建立项目时总会定义"Win32"。控制台

LINK的时候需要指定/subsystem,这个链接选项告知Windows如何运行可履行文件。

python可以包vc程序嘛

Python可以调用VC的模块。

Python调用C++在Python脚本里添加其中ctypes是Python的一个库,提供和C语言兼容的数据类型,可以很方便地调用CDLL中的函数。运行以上脚本得到:显示调用C++程序成功。

采用这个方法,我们不用进行大量的改写,也能在Python中使用我们积累的各种C++程序了。

c++调用python

要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的Extending embedding厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在Python Programming On Win32书中找到了教程。1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为:import mbmb.showMsg("Python's really amazing, I kindda love it!")2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。在vs 2005下点击菜单 "工具"-"选项", 打开选项对话框,选择"项目和解决方案-VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:#include python.h //python.h是包含python一些定义的头文件,在python的include目录下/*我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/#pragma comment(lib, "python25.lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用extern "C" __declspec(dllexport) void initmb(){/*当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key = showMsg, value =mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = {{"showMsg", mb_showMsg, METH_VARARGS},{NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里PyObject *m = Py_InitModule("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuplestatic PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,这个函数的原型是类似printf的不定参数的形式PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);*/if (!PyArg_ParseTuple(args, "s", msg))return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C module", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb.showMsg("Python's really amazing, I kindda love it!")

请采纳。

vc++调用python传递参数

建议把python脚本作成命令行传参,这样在C++中只需要用一个system函数就可以调用了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。