tl;博士
这适用于 GNU 版本的 libc(还没有在 uclibc 上尝试过)
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65),
('domain', c_char * 65) ]
gnar = uts_struct()
libc.uname(byref(gnar))
print gnar.nodename
原帖
以下代码段错误;我不确定我做错了什么。
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]
utsname = uts_struct()
libc.uname(byref(utsname))
print utsname.sysname
这做同样的事情:
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]
utsname = uts_struct()
utsname_pointer = pointer(utsname)
libc.uname(utsname_pointer)
print utsname.sysname
我一定是搞砸了一些基本的东西......
(我知道
os.uname()
,这只是一个理解练习,我失败了)我在这里引用了 uname 手册:http://www.cl.cam.ac.uk/cgi-bin/manpage?2+uname
我究竟做错了什么?
编辑:
感谢 Nemo 我能够得到数据;
>>> from ctypes import *
>>> libc = CDLL('libc.so.6')
>>> gnar = create_string_buffer(512)
>>> libc.uname(byref(gnar))
0
>>> print gnar.value
Linux
>>>
但是,我假设我只得到“Linux”,因为这些项目以 NULL 分隔,监管字符串也是如此。有什么方法可以读取NULL?
Edit2:
根据 Nemos 的评论,我试过这个 - 这不起作用,但我认为这可能是朝着正确方向迈出的一步......错误:
Traceback (most recent call last):
File "gnar.py", line 18, in <module>
utsname = uts_struct(gnar)
TypeError: incompatible types, c_char_Array_512 instance instead of c_char_p instance
这只是不可行吗?
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]
gnar = create_string_buffer(512)
libc.uname(byref(gnar))
utsname = uts_struct(gnar)
Edit3: (我要写有史以来最长的帖子……=P)
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65) ]
gnar = uts_struct()
libc.uname(byref(gnar))
print gnar.machine
这有效,但是,它在打印值后会出现段错误......
最终编辑:
以下作品 - 我当然使用 GNU 版本的 libc。 (我在 Ubuntu 机器上)所以添加域的字段就是停止段错误所需的全部。事后看来是有道理的。 :)
from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65),
('domain', c_char * 65) ]
gnar = uts_struct()
libc.uname(byref(gnar))
print gnar.nodename
最佳答案
根据 this uname man page ,该结构包含实现定义大小的数组,而不是 char* (c_char_p)。你看过 sys/utsname.h
中的结构定义吗?您必须匹配确切的结构定义。数据类型可能应该是 c_char * n
,其中 n 是 sys/utsname.h
中该字段的数组大小。
或者,您应该能够使用 print gnar.raw
访问第一个 编辑 中的所有字符串,只要缓冲区对于整个结构来说足够大。
关于python - 使用 Pythons ctypes 从 libc 调用 uname,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6221001/