c调用python
⑴ c++调用python
你看看是不是用64位的python库去link你的32位的程序了
⑵ c语言程序如何调用python程序
下面是一个例子:
首先是python的一个简单函数
class Hello:
def __init__(self, x):
self.a = x
def print(self, x=None):
print(x)
def xprint():
print("hello world")
if __name__ == "__main__":
xprint()
h = Hello(5)
h.print()1
下面是C语言
#include <python3.4m/Python.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
Py_Initialize();
// 将当前目录加入sys.path
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
// 导入hello.py模块
PyObject *pmole = PyImport_ImportMole("hello");
// 获得函数xprint对象,并调用,输出“hello world\n”
PyObject *pfunc = PyObject_GetAttrString(pmole, "xprint");
PyObject_CallFunction(pfunc, NULL);
// 获得类Hello并生成实例pinstance,并调用print成员函数,输出“5 6\n”
PyObject *pclass = PyObject_GetAttrString(pmole, "Hello");
PyObject *arg = Py_BuildValue("(i)", 5);
PyObject *pinstance = PyObject_Call(pclass, arg, NULL);
PyObject_CallMethod(pinstance, "print", "i", 6);
Py_Finalize();
return 0;
}
编译命令如下:
gcc pyapi.c -lpython3.4m -o pyapi
比如什么变量呢?
可以用命令行参数啊
system("python xxx.py arg1 arg2 ...")
如果让python接收参数自己查一下
⑷ C调用Python模块传参的问题 [
Py_BuildValue()函数可以和PyArg_ParseTuple()函数一样识别一系列的格式串,但是输入参数只能是值,而不能是指针。参考官方文档https://docs.python.org/2/c-api/arg.html?highlight=py_buildvalue#Py_BuildValue
⑸ c语言能不能调用python库函数
将event.py目录加入到system path中
1
2
3
import sys
sys.path.append("/Users/songrao/Library/Application Support/Sublime Text 3/Packages/User/")
from event import printme
⑹ 如何在C语言中调用python函数
C语言不能直接调用Python源程序,但是可以通过进程调用来实现。
⑺ C中调用Python函数,找不到模块
是因为你的模块的路径不对,必须先指定路径 PyObject *sys = PyImport_ImportMole("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyString_FromString(""));C中调用Python函数,找不到模块
⑻ C调用Python一个运行时间长的函数,如何实时
如果要在test.py中调用脚本func.py脚本
首先,两个脚本文件要放在pythonpath下,其次在test.py脚本的开头写上import func,这样就可以直接调用func中的函数方法了。
⑼ 如何在linux下用c调用过python
#include <string>
#include <map>
#include <Python.h>
typedef std::map<std::string,PyObject*> pyMoleMap;
typedef pyMoleMap::iterator pyMoleMapIter;
class PyOperBase
{
public:
static int initPython() //must running at the main thread
{
if(m_isInit == true)
return true;
Py_Initialize();
if(!Py_IsInitialized())
{
return false;
}
//Need to specify the current path path only Linux
#ifdef LINUX
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
#endif
//PyEval_InitThreads();
//PyEval_ReleaseThread(PyThreadState_Get());
m_isInit = true;
return true;
}
static int releasePython()
{
if(!m_isInit) return false;
pyMoleMapIter iter;
PyObject* pMole = NULL;
for(iter = m_MoleMap.begin(); iter != m_MoleMap.end(); iter++)
{
pMole = iter->second;
Py_DECREF(pMole);
}
m_MoleMap.clear();
//PyGILState_Ensure();
Py_Finalize();
m_isInit = false;
return true;
}
static bool getInitStatus()
{
return m_isInit;
}
static int getModleDictByScriptName(std::string& script, PyObject** object)
{
if(m_isInit != true)
return false;
PyObject *pName = NULL, *pMole = NULL;
pyMoleMapIter iter = m_MoleMap.find(script);
if(iter != m_MoleMap.end())
{
pMole = iter->second;
if(!getDictByModle(pMole,object))
return false;
return true;
}
pName = PyString_FromString(script.c_str());
pMole = PyImport_Import(pName);
Py_DECREF(pName);
if(!pMole)
{
return false;
}
if(!getDictByModle(pMole,object))
{
Py_DECREF(pMole);
return false;
}
m_MoleMap.insert(std::pair<std::string,PyObject*>(script,pMole));
return true;
}
private:
static int getDictByModle(PyObject* pModle, PyObject** ppDict)
{
PyObject *pDict = NULL;
pDict = PyMole_GetDict(pModle);
if(!pDict)
{
return false;
}
*ppDict = pDict;
return true;
}
static bool m_isInit;
static pyMoleMap m_MoleMap;
};
class PyThreadLock
{
public:
PyThreadLock(void)
{
state = PyGILState_Ensure( );
}
~PyThreadLock(void)
{
PyGILState_Release( state );
}
private:
PyGILState_STATE state;
};
.cpp文件如下
#include "XPS2SVG_py.h"
bool PyOperBase::m_isInit = false;
pyMoleMap PyOperBase::m_MoleMap;
我linux下环境变量配置好了python路径,所以直接#include <Python.h>了
以上代码在windows下跑没问题。
但到linux下,pMole = PyImport_Import(pName);会返回空
应该是没找到pName标识的模块,但是pName标识标识的模块文件就在可执行文件的当前目录下