我有一个关于python中可变大小的问题,我使用Ctypes是因为我想要一个1字节的数字,但是当我尝试通过python检查它的大小时(通过sys.getsize
)它说是80字节,但是当我用ctypes(via
ctypes.sizeof
)说它只有1个字节,有人可以告诉我有什么区别,为什么会有2个不同的大小?是因为python使用了对象还是包装器?当它发送到c时,它会查看实际尺寸吗?
import sys
import ctypes
print("size in ctypes is : ",ctypes.sizeof(ctypes.c_byte(1)))
print("size in sys is : ",sys.getsizeof(ctypes.c_byte(1)))
结果是
size in ctypes is : 1
size in sys is : 80
如果您想了解详细信息,则应该查看一下objects.h
(尤其是文件顶部的注释)。您ctypes.c_byte(1)
是一个Python对象:
>>> import sys
>>> import ctypes
>>> isinstance(ctypes.c_byte(1), object)
True
如@Daniel所述,sys.getsizeof
获取该Python对象的大小。该Python对象大于C中相应的对象。请注意以下几点object.h
:
Objects are structures allocated on the heap. . . .
The actual memory allocated for an object
contains other data that can only be accessed after casting the pointer
to a pointer to a longer structure type. This longer type must start
with the reference count and type fields; the macro PyObject_HEAD should be
used for this.
换句话说,宏PyObject_HEAD
附加到每个对象的开头。这增加了Python对象的大小。
ctypes.sizeof
另一方面,返回C
Python对象中数据类型的实际大小(使用C的sizeof
运算符)。
编辑
根据您在Daniel的评论中提到的目标,可以在Python
3.x中通过服务器发送一个字节。下面是一个示例,说明如何使用Python的socket
模块发送字节来证明这一点。
这是服务器,您将在一个Python解释器中运行该服务器:
# Server
import socket
HOST = '' # All available interfaces
PORT = 50007 # Same port as client
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1) # receive data with bufsize 1; a larger bufsize will break this code
if not data: break
conn.sendall(data)
conn.close()
这是客户端,您将在另一个python解释器中运行该客户端:
# Client
import socket
HOST = '127.0.0.1' # The remote host, but here using localhost
PORT = 50007 # The port used by both the client and server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'1') # a bytes object
data = s.recv(1) # Receive data from the socket with bufsize of 1
s.close()
print('Received', repr(data)) # confirm receipt
本文向大家介绍Python使用ctypes调用C/C++的方法,包括了Python使用ctypes调用C/C++的方法的使用技巧和注意事项,需要的朋友参考一下 python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, a
本文向大家介绍python使用ctypes调用扩展模块的实例方法,包括了python使用ctypes调用扩展模块的实例方法的使用技巧和注意事项,需要的朋友参考一下 楔子 我们知道python的执行效率不是很高,而且由于GIL的原因,导致python不能充分利用多核CPU。一般的解决方式是使用多进程,但是多进程开销比较大,而且进程之间的通信也会比较麻烦。因此在解决效率问题上,我们会把那些比较耗时的模
普通python套接字模块在创建套接字时除了AF_INET不支持协议: 从海星套接字模块.c: 尽管在Linux下支持AF_PACKET、AF_NETLINK和AF_TIPC,但仅支持AF_INET、AF_INET6和AF_UNIX地址族 因此,我已经开始使用ctypes手动调用普通BSD套接字库的套接字、绑定、侦听和直接接受来自libc的调用。我可以创建套接字,将套接字绑定到地址,并将套接符置于
本文向大家介绍在Python中使用swapCase()方法转换大小写的教程,包括了在Python中使用swapCase()方法转换大小写的教程的使用技巧和注意事项,需要的朋友参考一下 swapCase()方法返回所有可大小写,基于字符大小写交换字符串的一个副本。 语法 以下是swapCase()方法的语法: 参数 NA 返回值 此方法返回其中所有基于大小写字符交换字符串的一个副本。 例子
本文向大家介绍python安装与使用redis的方法,包括了python安装与使用redis的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python安装与使用redis的方法。分享给大家供大家参考,具体如下: 1、安装 好吧,我承认我只会最简单的安装: python 支持包: (其实就一个文件,搞过来就能用) 2、配置 配置一下吧,默认配置文件在: "/etc/redis/red
本文向大家介绍python读取图片并修改格式与大小的方法,包括了python读取图片并修改格式与大小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python读取图片并修改文件大小的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。