當前位置:首頁 » 編程語言 » 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)

熱點內容
aspx腳本 發布:2025-02-01 06:44:13 瀏覽:999
訪問策略更新 發布:2025-02-01 06:39:29 瀏覽:498
pythoneditplus 發布:2025-02-01 06:31:57 瀏覽:275
bmp轉png源碼 發布:2025-02-01 06:30:08 瀏覽:470
魔獸聯盟人多的伺服器是什麼 發布:2025-02-01 06:25:25 瀏覽:41
c語言字元串子串刪除 發布:2025-02-01 06:25:23 瀏覽:534
怎麼改電腦鎖屏密碼 發布:2025-02-01 06:16:55 瀏覽:472
存儲卡不能格式化怎麼辦 發布:2025-02-01 06:02:55 瀏覽:691
scratch編程網站 發布:2025-02-01 05:51:27 瀏覽:396
安卓怎麼更好用 發布:2025-02-01 05:45:38 瀏覽:147