当前位置:首页 » 编程语言 » python调用clinux

python调用clinux

发布时间: 2022-07-19 13:33:40

A. 如何在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标识标识的模块文件就在可执行文件的当前目录下

B. 如何用python 调用c写的驱动

我觉得会受到限制的,因为c_char_p是遵循c字符串标准的,会以NULL为结束。下面的代码只输出hello,也许真要传递内嵌NULL的,只能靠编写python扩展了,也很简单的,用swig。
from
ctypes
import
*
import
struct
example=cdll.LoadLibrary("example.dll")
s=create_string_buffer('hello\x00world')
example.test.restype=c_char_p
example.test.argtypes
=
[c_char_p]
r=example.test(s)
#("hello\x00world")
print
r

C. 问一个Python的问题,请问我现在要在linux用c语言来做一些计算,但是数据是由一个python写的程序出来的

python可以嵌入到c语言中,也可以调用C的函数库
如果只是数据的话,麻烦一点,可以将数据用python储存在一个文件中,再由c读取
至于i/o的问题,我具体也不清楚
个人也是非专业人士

D. 如何让python调用C和C++代码

如何让python调用C和C++代码

安装python后,会有一个chm格式的python手册。要搞明白如何让python调用C/C++代码(也就是写python的 extension),你需要征服手册中的
<<Extending && embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他 书籍,最终在<<Python Programming On Win32>>书中找到了教程。
下面记录一下如何在visual studio 2005中,写一段C/C++的MessageBox代码,然后提供后python调用,最后的结果当然是显示一个MessageBox.
1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个 dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:\Program Files\Python25\DLLs),假如我们接下来要写的扩展mole名为mb,python调用的代码为: import mb
mb.showMsg("Python's really amazing, I kindda love it!")
python怎么找到我们的mb模块呢?就是上面说的,我们要生成一个mb.dll,然后拷贝到Dlls目录下面,为了区别普通的dll和python专用扩展的dll,我们的 mb.dll修改成mb.pyd(python dll)
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里去调用
initmb函数,这个函数告诉python我们有些什么函数,该怎么告诉python我们有一个showMsg函数呢?下面详解 */
//必须extern "C"下,这样不会在C++编译器里不会更改掉导出的函数名字,我第一次就犯了这样的错误
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_InitMole("mb", mbMethods); } /*
接下来实现核心功能showMsg */
//第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple
static 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;
//调用MB
int r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);
//返回值
return Py_BuildValue("i", r); }
将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码: import mb
mb.showMsg("Python's really amazing, I kindda love it!")
可以看到弹出来一个MessageBox。

E. linux C语言调用Python脚本

比如什么变量呢?
可以用命令行参数啊
system("python xxx.py arg1 arg2 ...")
如果让python接收参数自己查一下

F. Python脚本在Linux上怎么运行

linux有下列的几种方法来运行python脚本:(注:我所用的python环境为2.6)一.终端命令行下[]$python"name.py"二.python环境中若脚本名称为name.py,其内容为:a='head'b='hehe'print(a,b)则使用>>>impportname针对此种方法我们使用下面的语句来显示内容:>>>print(name.a)>>>head>>>print(name.b)>>>hehe在同一个python环境中,第一次import加载以后,以后再使用import就不会有相应的结果显示了,在这个时候可以使用>>>reload(name)在python3.0中可能要加载ipm模块才能使用reload()函数>>>fromimpimportreload>>>reload(name)三.使用from假设脚本的名称为name.pyname.py的内容为:a='head'b='hehe'print(a,b)可以使用下边的方法来运行脚本:>>>fromnameimporta,b,c在这个python环境中我们就可以使用简单的变量名来调用其内容了。eg:>>>a>>>'head'>>>b>>>'hehe'四.使用exec方法为:>>>exec(open('name.py').read())NOTICE:在上面的方法中,第三种和第四种方法会默认覆盖python环境中已经存在的且和name.py中有重名的变量名,且系统不会给出提示,请注意这一点!!!

G. LINUX下要在C中嵌入Python,编译的时候怎样解决库的连接问题

gcc编译时,当使用动态库编译可以按照几种写法1.gcctest.c./libSDL2-2.so2.gcctest.c-lSDL2-23.gcctest.c-L/home/test-lSDL2-2一般的编译参数都是按照2或3去写2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库就会去找静态库,再没有应该就会在编译时报错3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf-aa.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的操作你第二次操作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd操作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。你可以试试将a.out拷贝至其他目录再次运行,将出现和第一次操作时一样的现象,找不到function.so文件。具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln-slibSDL2-2.so.0libSDL2-2.so)或者直接修改名称为libSDL2-2.so

H. linux中C和python的关系是什么

逻辑运算,都是短路求值,
不同在于c中返回的始终是逻辑值,
而python中返回的是实际的对象

I. 你好,python初学者,需要利用python调用一个现成的C写的dvbsnoop,它是在linux下的终端输入命令使用的。

你想 同命令行交互?试试pexpect模块。这样做是最简洁的。

如果想修改dvbsnoop,可以写成python模块供python脚本调用。 或者反过来,在c中内嵌python,调用你的python脚本也可以。但都要花很多时间。

J. python 怎么调用c语言接口

ctypes: 可直接调用c语言动态链接库。

使用步骤:

1> 编译好自己的动态连接库
2> 利用ctypes载入动态连接库
3> 用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:

#Step1:test.c#include<stdio.h>

intadd(inta,intb)
{
returna+b;
}#Step2:编译动态链接库(如何编译动态链接库在本文不详解,网上资料一大堆。)gcc-fPIC-sharedtest.c-olibtest.so
#Step3:test.py
fromctypesimport*mylib=CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")add=mylib.add
add.argtypes=[c_int,c_int]#参数类型,两个int(c_int是ctypes类型,见上表)
add.restype=c_int#返回值类型,int(c_int是ctypes类型,见上表)
sum=add(3,6)

热点内容
android下拉刷新通用 发布:2025-02-01 05:03:51 浏览:905
紫光存储最近 发布:2025-02-01 04:58:49 浏览:380
sqlserver重命名 发布:2025-02-01 04:56:24 浏览:428
iisftp被动模式 发布:2025-02-01 04:41:50 浏览:350
车载安卓怎么安装软件 发布:2025-02-01 04:30:50 浏览:469
安卓系统su程序是什么 发布:2025-02-01 04:25:42 浏览:475
android代码行数统计 发布:2025-02-01 04:20:47 浏览:216
快速喊话脚本 发布:2025-02-01 04:16:48 浏览:885
如何分辨普拉多的配置 发布:2025-02-01 04:11:45 浏览:681
linuxc文件删除 发布:2025-02-01 04:11:33 浏览:218