如何在linux下用c调用过python?

Enter空格 2014-02-17 01:13:00
请问下,为啥我用PyImport_Import导入脚本模块对象,返回为空.
windows下没这问题,可以返回被导入的脚本模块对象。
我linux下有添加下面这段代码啊
#ifdef LINUX
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
#endif
但是就是找不到当前目录下的python脚本,
...全文
253 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
minmin_654321 2014-07-07
  • 打赏
  • 举报
回复
我也遇到了同样的问题~请问楼主是linux下什么配置的有问题~
Enter空格 2014-02-18
  • 打赏
  • 举报
回复
就是我机器配置的问题。 linux下配置东西太烦了。
图灵狗 2014-02-17
  • 打赏
  • 举报
回复
我用Python2.6在Ubuntu10.10上测试没有问题:

#include <stdio.h>
#include <Python.h>

int main(int argc, char* argv[])
{
	PyObject *pModule = NULL;
	PyObject *pFunc = NULL;

	Py_Initialize();
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	pModule = PyImport_ImportModule("hello");
	pFunc = PyObject_GetAttrString(pModule, "hello");
	PyEval_CallObject(pFunc, NULL);
	Py_Finalize();
    
	return 0;
}

gcc -I/usr/include/python2.6/ -L/usr/lib/ -lpython2.6 -o main main.c
确保在当前目录下放置hello.py

def hello():
	print 'Hello!'
引用 7 楼 mymixing 的回复:
不行,我试过了 下面这样的代码照样返回空。 是不是我linux下的配置有问题?
#include <stdio.h>
#include <iostream>
#include <Python.h>
int main(int argc, char* argv[])
{
	PyObject *pModule = NULL;
	Py_Initialize();
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	pModule = PyImport_ImportModule("Py_PubUtility");
	if(!pModule)
		printf("Error");
	getchar();
	return 0;
}
Enter空格 2014-02-17
  • 打赏
  • 举报
回复
不行,我试过了 下面这样的代码照样返回空。 是不是我linux下的配置有问题?
#include <stdio.h>
#include <iostream>
#include <Python.h>
int main(int argc, char* argv[])
{
	PyObject *pModule = NULL;
	Py_Initialize();
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	pModule = PyImport_ImportModule("Py_PubUtility");
	if(!pModule)
		printf("Error");
	getchar();
	return 0;
}
图灵狗 2014-02-17
  • 打赏
  • 举报
回复
试试3楼的方法。
引用 5 楼 mymixing 的回复:
谁在linux下做过类似的事情啊,帮帮忙啊~
Enter空格 2014-02-17
  • 打赏
  • 举报
回复
谁在linux下做过类似的事情啊,帮帮忙啊~
Enter空格 2014-02-17
  • 打赏
  • 举报
回复
我贴一下我的代码吧。 .h文件如下

#include <string>
#include <map>
#include <Python.h>


typedef std::map<std::string,PyObject*>					pyModuleMap;
typedef	pyModuleMap::iterator							pyModuleMapIter;

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;

		pyModuleMapIter iter;
		PyObject* pModule = NULL;
		for(iter = m_ModuleMap.begin(); iter != m_ModuleMap.end(); iter++)
		{
			pModule = iter->second;
			Py_DECREF(pModule);
		}

		m_ModuleMap.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, *pModule = NULL;
		pyModuleMapIter iter = m_ModuleMap.find(script);
		if(iter != m_ModuleMap.end())
		{
			pModule = iter->second;
			if(!getDictByModle(pModule,object))
				return false;
			return true;
		}
			
		pName = PyString_FromString(script.c_str());
		pModule = PyImport_Import(pName);
		Py_DECREF(pName);
		if(!pModule)
		{
			return false;
		}

		if(!getDictByModle(pModule,object))
		{
			Py_DECREF(pModule);
			return false;
		}
			
		m_ModuleMap.insert(std::pair<std::string,PyObject*>(script,pModule));
		return true;
	}

private:
	static int		getDictByModle(PyObject* pModle, PyObject** ppDict)
	{	
		PyObject *pDict = NULL;
		pDict = PyModule_GetDict(pModle);
		if(!pDict)
		{
			return false;
		}
		*ppDict = pDict;
		return true;
	}

	static bool				m_isInit;
	static pyModuleMap		m_ModuleMap;
};

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;
pyModuleMap			PyOperBase::m_ModuleMap;
我linux下环境变量配置好了python路径,所以直接#include <Python.h>了 以上代码在windows下跑没问题。 但到linux下,pModule = PyImport_Import(pName);会返回空 应该是没找到pName标识的模块,但是pName标识标识的模块文件就在可执行文件的当前目录下,
图灵狗 2014-02-17
  • 打赏
  • 举报
回复
参考http://blog.chinaunix.net/uid-22920230-id-3418169.html
引用 楼主 mymixing 的回复:
请问下,为啥我用PyImport_Import导入脚本模块对象,返回为空. windows下没这问题,可以返回被导入的脚本模块对象。 我linux下有添加下面这段代码啊 #ifdef LINUX PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); #endif 但是就是找不到当前目录下的python脚本,
derekrose 2014-02-17
  • 打赏
  • 举报
回复
先找一个小例子看看你和他有什么不一样
赵4老师 2014-02-17
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧