我是第一次用python代碼撰寫。想從 python 呼叫 C 共享庫函式,但是問題是無法傳遞包含自定義資料型別的結構。
mylib.c
#include <stdio.h>
typedef int integer;
typedef char character;
struct temp {
integer a;
character b;
};
void
do_something(
struct temp *abc)
{
abc->a = 100;
abc->b = 'M';
return;
}
編譯步驟
# gcc -fPIC -shared -o mylib.so mylib.c
請考慮將整數和字符視為其他一些用戶定義的資料型別,盡管在上面的示例中它們是原始資料型別 int 和 char 的 typedef,但在我的情況下它們不是,對于各種情況,例如機器是 32 位,有 2 或 3 級間接性或 64 位,或者如果在 solaris、AIX 或 Linux 等上作業。
我已經撰寫了一個示例 python 程式,如果我使用 ctypes.c_int 和 ctypes.c_char,它也可以正常作業,但我想在 python 代碼中使用整數和字符自定義資料型別。基本上想撰寫python代碼,因為它不依賴于實際的原始型別。
Python3程式
import ctypes
class sample(ctypes.Structure):
_fields_ = [
("a", ctypes.c_int),
("b", ctypes.c_char)]
s = sample()
do_something = ctypes.CDLL("/root/Documents/python/mylib.so").do_something
do_something.argtypes = [ctypes.POINTER(sample)]
do_something(s)
print(s.a)
print(s.b)
輸出:
100
b'M'
謝謝!
回復@Mark Tolonen 查詢
雖然我無法粘貼實際代碼,但下面的代碼與實際代碼非常相似,這里的 struct 具有 pid_t 欄位(雖然它目前在內部是整數型別,但我認為依靠這個事實并不好)、timeval 結構和檔案大小可以根據 OFFSET64 宣告進行更改。
我希望從 C 庫中填充結構資訊(在 python 代碼中分配)。
#include <unistd.h>
#include <sys/time.h>
typedef unsigned int __filesize;
typedef unsigned long long __filesize64;
typedef unsigned long inode_t;
#ifndef OFFSET64
typedef __filesize filesize;
#endif
#ifdef OFFSET64
typedef __filesize64 filesize;
#endif
struct info {
pid_t pid;
struct timeval atime;
filesize sz;
inode_t i_number;
};
void
did_something(
struct info *p_info)
{
p_info->pid = getpid();
gettimeofday(&p_info->atime, NULL);
p_info->sz = 512;
p_info->i_number = 2;
return;
}
uj5u.com熱心網友回復:
我沒有去挖掘, 或的定義pid_t,但由于提供了定義,這里有一種定義它的方法:timevalinode_tfilesize
OFFSET64 = True # or False
if OFFSET64:
filesize = ctypes.c_ulonglong
else:
filesize = ctypes.c_uint
然后filesize在結構的類定義中使用:
class info(ctypes.Structure):
_fields_ = (...
('sz', filesize),
...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488065.html
下一篇:如何在C中查看結構的對齊方式?
