python在导入自己的模块时显示找不到?

解决方法1:此种办法当时生效,但是需要写入每一个文件中,才能import不出错。

widows下 python环境变量配置 便于cmd命令行操作,例如:直接进入Python解释器环境.使用pip安装模块等.

Windows环境下python的安装与使用 一.python如何运行程序 首先说一下python解释器,它是一种让其他程序运行起来的程序.当你编写了一段python程序,python解释器将读取程序 ...

基本概念 顾名思义,PriorityQueue是优先级队列,它首先实现了队列接口(Queue),与LinkedList类似,它的队列长度也没有限制,与一般队列的区别是,它有优先级的概念,每个元素都有优 ...

1.目的 在编写代码时会受到公司Sonar规则的限制,不想在编写完成后再对代码进行Inspect,回头再来一个个修正,费时费力. 那么,下面将通过优秀的WebStorm开发工具自身的CodeInspe ...

1.找到项目文件 2.用记事本打开 .project 把里面涉及到spring的全部删除就可以了.

在IDE下调试怎么也没有发现问题,但是部署到服务器上,提示找不到资源,找了半天资料总算是找到了原因: Jar包中的资源加载不能使用File方式,只能使用InputStream方式读取.知道原因就好解决 ...


· 超过39用户采纳过TA的回答

首先确认是否安装了这个模块,如果没有,到pypi找到安装即可,如果确认已经安装,检查导入时大小写,如果无误检查模块路径中是否有。

你对这个回答的评价是?

第一:你是不有这些东西
第二:路径设置的对不对,环境变量等!

你对这个回答的评价是?

提示缺什么模块,就到pypi站上找来安装即可。

你对这个回答的评价是?

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。

的一个别名。所以,在程序输出 而不是你期望的 时不必感到迷惑 --- 它们实际上是同一种类型。

对象用于载入动态连接库。

通过操作这些对象的属性,你可以载入外部的动态链接库。cdll 载入按标准的 cdecl 调用协议导出的函数,而 windll 导入的库按 stdcall 调用协议调用其中的函数。 oledll 也按 stdcall 调用协议调用其中的函数,并假定该函数返回的是 Windows HRESULT 错误代码,并当函数调用失败时,自动根据该代码甩出一个 异常。

这是一些 Windows 下的例子。注意:msvcrt 是微软 C 标准库,包含了大部分 C 标准函数,这些函数都是以 cdecl 调用协议进行调用的。

通过 cdll.msvcrt 调用的标准 C 函数,可能会导致调用一个过时的,与当前 Python 所不兼容的函数。因此,请尽量使用标准的 Python 函数,而不要使用 msvcrt 模块。

在 Linux 下,必须使用 包含 文件扩展名的文件名来导入共享库。因此不能简单使用对象属性的方式来导入库。因此,你可以使用方法 LoadLibrary(),或构造 CDLL 对象来导入库。

操作导入的动态链接库中的函数

通过操作dll对象的属性来操作这些函数。

A 结尾。 win32的 GetModuleHandle 函数会根据一个模块名返回一个 模块句柄,该函数暨同时包含这样的两个版本的原型函数,并通过宏 UNICODE 是否定义,来决定宏

windll 不会通过这样的魔法手段来帮你决定选择哪一种函数,你必须显式的调用 GetModuleHandleAGetModuleHandleW,并分别使用字节对象或字符串对象作参数。

有时候,dlls的导出的函数名不符合 Python 的标识符规范,比如 "??2@YAPAXI@Z"。此时,你必须使用 方法来获得该函数。

Windows 下,有些 dll 导出的函数没有函数名,而是通过其顺序号调用。对此类函数,你也可以通过 dll 对象的数值索引来操作这些函数。

你可以貌似是调用其它 Python 函数那样直接调用这些函数。在这个例子中,我们调用了 time() 函数,该函数返回一个系统时间戳(从 Unix 时间起点到现在的秒数),而``GetModuleHandleA()`` 函数返回一个 win32 模块句柄。

此函数中调用的两个函数都使用了空指针(用 None 作为空指针):

如果你用 cdecl 调用方式调用 stdcall 约定的函数,则会甩出一个异常 。反之亦然。

你必须阅读这些库的头文件或说明文档来确定它们的正确的调用协议。

在 Windows 中, 使用 win32 结构化异常处理来防止由于在调用函数时使用非法参数导致的程序崩溃。

然而,总有许多办法,通过调用 使得 Python 程序崩溃。因此,你必须小心使用。 模块可以用于帮助诊断程序崩溃的原因。(比如由于错误的C库函数调用导致的段错误)。

None,整型,字节对象和(UNICODE)字符串是仅有的可以直接作为函数参数使用的四种Python本地数据类型。None` 作为C的空指针 (NULL),字节和字符串类型作为一个指向其保存数据的内存块指针 (char*wchar_t*)。Python 的整型则作为平台默认的C的 int 类型,他们的数值被截断以适应C类型的整型长度。

在我们开始调用函数前,我们必须先了解作为函数参数的 数据类型。

定义了一些和C兼容的基本数据类型:

  1. 构造函数接受任何具有真值的对象。

所有这些类型都可以通过使用正确类型和值的可选初始值调用它们来创建:

由于这些类型是可变的,它们的值也可以在以后更改:

当给指针类型的对象 , 和 等赋值时,将改变它们所指向的 内存地址,而 不是 它们所指向的内存区域的 内容 (这是理所当然的,因为 Python 的 bytes

但你要注意不能将它们传递给会改变指针所指内存的函数。如果你需要可改变的内存块,ctypes 提供了 函数,它提供多种方式创建这种内存块。当前的内存块内容可以通过 raw 属性存取,如果你希望将它作为NUL结束的字符串,请使用 value 属性:

(仍然可当作别名使用)和 c_string() 函数。 函数创建包含 unicode 字符的可变内存块,与之对应的C语言类型是 wchar_t

注意 printf 将打印到真正标准输出设备,而*不是* ,因此这些实例只能在控制台提示符下工作,而不能在 IDLEPythonWin 中运行。

正如前面所提到过的,除了整数、字符串以及字节串之外,所有的 Python 类型都必须使用它们对应的 类型包装,才能够被正确地转换为所需的C语言类型。

使用自定义的数据类型调用函数

你也可以通过自定义 参数转换方式来允许自定义类型作为参数。 会寻找 _as_parameter_ 属性并使用它作为函数参数。当然,它必须是数字、字符串或者二进制字符串:

如果你不想把实例的数据存储到 _as_parameter_ 属性。可以通过定义 函数计算出这个属性。

指定必选参数的类型(函数原型)

可以通过设置 argtypes 属性的方法指定从 DLL 中导出函数的必选参数类型。

argtypes 必须是一个 C 数据类型的序列 (这里的 printf 可能不是个好例子,因为它是变长参数,而且每个参数的类型依赖于格式化字符串,不过尝试这个功能也很方便):

指定数据类型可以防止不合理的参数传递(就像 C 函数的原型),并且会自动尝试将参数转换为需要的类型:

如果你想通过自定义类型传递参数给函数,必须实现 from_param() 类方法,才能够将此自定义类型用于 argtypes 序列。from_param() 类方法接受一个 Python 对象作为函数输入,它应该进行类型检查或者其他必要的操作以保证接收到的对象是合法的,然后返回这个对象,或者它的 _as_parameter_ 属性,或者其他你想要传递给 C 函数的参数。这里也一样,返回的结果必须是整型、字符串、二进制字符串、 类型,或者一个具有

默认情况下都会假定函数返回 C int 类型。 其他返回类型可以通过设置函数对象的 restype 属性来指定。

这是个更高级的例子,它调用了 strchr 函数,这个函数接收一个字符串指针以及一个字符作为参数,返回另一个字符串指针。

如果希望避免上述的 ord("x") 调用,可以设置 argtypes 属性,第二个参数就会将单字符的 Python 二进制字符对象转换为 C 字符:

如果外部函数返回了一个整数,你也可以使用要给可调用的 Python 对象(比如函数或者类)作为 restype 属性的值。将会以 C 函数返回的 整数 对象作为参数调用这个可调用对象,执行后的结果作为最终函数返回值。这在错误返回值校验和自动抛出异常等方面比较有用。

WinError 函数可以调用 Windows 的 FormatMessage() API 获取错误码的字符串说明,然后 返回 一个异常。 WinError 接收一个可选的错误码作为参数,如果没有的话,它将调用

请注意,使用 errcheck 属性可以实现更强大的错误检查手段;详情请见参考手册。

传递指针(或以引用方式传递形参)

有时候 C 函数接口可能由于要往某个地址写入值,或者数据太大不适合作为值传递,从而希望接收一个 指针 作为数据参数类型。这和 传递参数引用 类似。

暴露了 函数用于通过引用传递参数,使用 函数也能达到同样的效果,只不过 需要更多步骤,因为它要先构造一个真实指针对象。所以在 Python 代码本身不需要使用这个指针对象的情况下,使用 效率更高。

结构体和联合必须继承自 模块中的 和 。子类必须定义 _fields_ 属性。

type 字段必须是一个 类型,比如 ,或者其他 类型: 结构体、联合、数组、指针。

这是一个简单的 POINT 结构体,它包含名称为 xy 的两个变量,还展示了如何通过构造函数初始化结构体。

当然,你可以构造更复杂的结构体。一个结构体可以通过设置 type 字段包含其他结构体或者自身。

嵌套结构体可以通过几种方式构造初始化:

可以通过 获取字段 ,它能提供很多有用的调试信息。

不支持带位域的结构体、联合以值的方式传给函数。这可能在 32 位 x86 平台上可以正常工作,但是对于一般情况,这种行为是未定义的。带位域的结构体、联合应该总是通过指针传递给函数。

结构体/联合字段对齐及字节顺序

默认情况下,结构体和联合的字段与 C 的字节对齐是一样的。也可以在定义子类的时候指定类的 _pack_ 属性来覆盖这种行为。 它必须设置为一个正整数,表示字段的最大对齐字节。这和 MSVC 中的 #pragma pack(n) 功能一样。

中的结构体和联合使用的是本地字节序。要使用非本地字节序,可以使用 , , BigEndianUnion, and LittleEndianUnion 作为基类。这些类不能包含指针字段。

结构体和联合中是可以包含位域字段的。位域只能用于整型字段,位长度通过 _fields_ 中的第三个参数指定:

数组是一个序列,包含指定个数元素,且必须类型相同。

创建数组类型的推荐方式是使用一个类型乘以一个正数:

下面是一个构造的数据案例,结构体中包含了4个 POINT 和一些其他东西。

和平常一样,通过调用它创建实例:

以上代码会打印几行 0 0 ,因为数组内容被初始化为 0.

也能通过指定正确类型的数据来初始化:

可以将 类型数据传入 函数创建指针:

指针实例拥有 属性,它返回指针指向的真实对象,如上面的 i 对象:

注意 并没有 OOR (返回原始对象), 每次访问这个属性时都会构造返回一个新的相同对象:

将这个指针的 contents 属性赋值为另一个 实例将会导致该指针指向该实例的内存地址:

指针对象也可以通过整数下标进行访问:

通过整数下标赋值可以改变指针所指向的真实内容:

使用 0 以外的索引也是合法的,但是你必须确保知道自己为什么这么做,就像 C 语言中: 你可以访问或者修改任意内存内容。 通常只会在函数接收指针是才会使用这种特性,而且你 知道 这个指针指向的是一个数组而不是单个值。

内部细节, 函数不只是创建了一个指针实例,它首先创建了一个指针 类型 。这是通过调用 函数实现的,它接收 类型为参数,返回一个新的类型:

无参调用指针类型可以创建一个 NULL 指针。 NULL 指针的布尔值是 False

解引用指针的时候, 会帮你检测是否指针为 NULL (但是解引用无效的 非

通常情况下, ctypes 具有严格的类型检查。这代表着, 如果在函数 argtypes 中或者结构体定义成员中有 POINTER(c_int) 类型,只有相同类型的实例才会被接受。 也有一些例外。比如,你可以传递兼容的数组实例给指针类型。所以,对于

另外,如果一个函数 argtypes 列表中的参数显式的定义为指针类型(如 POINTER(c_int) ),指针所指向的 类型 (这个例子中是 c_int )也可以传递给函数。ctypes 会自动调用对应的 转换。

可以给指针内容赋值为 None 将其设置为 Null

有时候你拥有一个不兼容的类型。 在 C 中,你可以将一个类型强制转换为另一个。 中的 a 函数提供了相同的功能。 上面的结构体 Barvalue 字段接收 POINTER(c_int) 指针或者 数组,但是不能接受其他类型的实例:

这种情况下, 需要手动使用 函数。

函数可以将一个指针实例强制转换为另一种 ctypes 类型。 接收两个参数,一个 ctypes 指针对象或者可以被转换为指针的其他类型对象,和一个 ctypes 指针类型。 返回第二个类型的一个实例,该返回实例和第一个参数指向同一片内存空间:

0

不完整类型 即还没有定义成员的结构体、联合或者数组。在 C 中,它们通常用于前置声明,然后在后面定义:

直接翻译成 ctypes 的代码如下,但是这行不通:

因为新的 cell 在 class 语句结束之前还没有完成定义。在

让我们试试。我们定义两个 cell 实例,让它们互相指向对方,然后通过指针链式访问几次:

允许创建一个指向 Python 可调用对象的 C 函数。它们有时候被称为 回调函数

首先,你必须为回调函数创建一个类,这个类知道调用约定,包括返回值类型以及函数接收的参数类型及个数。

工厂函数使用 cdecl 调用约定创建回调函数类型。在 Windows 上, 工厂函数使用 stdcall 调用约定为回调函数创建类型。

这些工厂函数的第一个参数是返回值类型,回调函数的参数类型作为剩余参数。

这里展示一个使用 C 标准库函数 qsort() 的例子,它使用一个回调函数对数据进行排序。 qsort() 将用来给整数数组排序:

qsort() 必须接收的参数,一个指向待排序数据的指针,元素个数,每个元素的大小,以及一个指向排序函数的指针,即回调函数。然后回调函数接收两个元素的指针,如果第一个元素小于第二个,则返回一个负整数,如果相等则返回0,否则返回一个正整数。

所以,我们的回调函数要接收两个整数指针,返回一个整数。首先我们创建回调函数的 类型

首先,这是一个简单的回调,它会显示传入的值:

现在我们可以比较两个元素并返回有用的结果了:

我们可以轻易地验证,现在数组是有序的了:

这些工厂函数可以当作装饰器工厂,所以可以这样写:

请确保你维持的 对象的引用周期与它们在 C 代码中的使用期一样长。 不会确保这一点,如果不这样做,它们可能会被垃圾回收,导致程序在执行回调函数时发生崩溃。

注意,如果回调函数在Python之外的另外一个线程使用(比如,外部代码调用这个回调函数), ctypes 会在每一次调用上创建一个虚拟 Python 线程。这个行为在大多数情况下是合理的,但也意味着如果有数据使用 方式存储,将无法访问,就算它们是在同一个 C 线程中调用的 。

访问 dll 的导出变量

一些动态链接库不仅仅导出函数,也会导出变量。一个例子就是 Python 库本身的 ,根据启动选项 、 的不同,它是值可能为 0、1、2 的整型。

如果解释器使用 选项启动,这个例子会打印 c_long(1) , 如果使用 启动,则会打印 c_long(2)

一个扩展例子, 同时也展示了使用指针访问 Python 导出的 指针对象。

对文档中这个值的解释说明

作为结束标记。当一个冻结模块被导入,首先要在这个表中搜索。第三方库可以以此来提供动态创建的冻结模块集合。

这足以证明修改这个指针是很有用的。为了让实例大小不至于太长,这里只展示如何使用 读取这个表:

我们定义了 struct   数据类型,接着就可以获取这张表的指针了:

由于 table 是指向 struct_frozen 数组的 指针 ,我们可以遍历它,只不过需要自己判断循环是否结束,因为指针本身并不包含长度。它早晚会因为访问到野指针或者什么的把自己搞崩溃,所以我们最好在遇到 NULL 后就让它退出循环:

Python 的冻结模块和冻结包(由负 size 成员表示)并不是广为人知的事情,它们仅仅用于实验。例如,可以使用 import __hello__ 尝试一下这个功能。

也有自己的边界,有时候会发生一些意想不到的事情。

rc.a 这行代码展开后的步骤:

记住,访问被包含在结构体、联合、数组中的对象并不会将其 复制 出来,而是得到了一个代理对象,它是对根对象的内部内容的一层包装。

下面是另一个可能和预期有偏差的例子:

使用   实例化的对象只能将其值设置为 bytes 或者整数。

为什么这里打印了 False ? ctypes 实例是一些内存块加上一些用于访问这些内存块的 组成。将 Python 对象存储在内存块并不会存储对象本身,而是存储了对象的 内容 。每次访问对象的内容都会构造一个新的 Python 对象。

对变长数组和结构体提供了一些支持 。

这非常好,但是要怎么访问数组中额外的元素呢?因为数组类型已经定义包含4个元素,导致我们访问新增元素时会产生以下错误:

使用 访问变长数据类型的一个可行方法是利用 Python 的动态特性,根据具体情况,在知道这个数据的大小后,(重新)指定这个数据的类型。

正如之前小节的说明,外部函数可作为被加载共享库的属性来访问。 用此方式创建的函数对象默认接受任意数量的参数,接受任意 ctypes 数据实例作为参数,并且返回库加载器所指定的默认结果类型。 它们是一个私有类的实例:

C 可调用外部函数的基类。

外部函数的实例也是兼容 C 的数据类型;它们代表 C 函数指针。

此行为可通过对外部函数对象的特殊属性赋值来自定义。

赋值为一个 ctypes 类型来指定外部函数的结果类型。 使用 None 表示 void,即不返回任何结果的函数。

赋值为一个不为 ctypes 类型的可调用 Python 对象也是可以的,在此情况下函数应返回 C int,该可调用对象将附带此整数被调用,以允许进一步的处理或错误检测。 这种用法已被弃用,为了更灵活的后续处理或错误检测请使用一个 ctypes 数据类型作为 并将 属性赋值为一个可调用对象。

赋值为一个 ctypes 类型的元组来指定函数所接受的参数类型。 使用 stdcall 调用规范的函数只能附带与此元组长度相同数量的参数进行调用;使用 C 调用规范的函数还可接受额外的未指明参数。

当外部函数被调用时,每个实际参数都会被传给 元组中条目的 from_param() 类方法,此方法允许将实际参数适配为此外部函数所接受的对象。 例如, 元组中的 条目将使用 ctypes 约定规则把作为参数传入的字符串转换为字节串对象。

新增:现在可以将不是 ctypes 类型的条目放入 argtypes,但每个条目都必须具有 from_param() 方法用于返回可作为参数的值(整数、字符串、ctypes 实例)。 这样就允许定义可将自定义对象适配为函数形参的适配器。

将一个 Python 函数或其他可调用对象赋值给此属性。 该可调用对象将附带三个及以上的参数被调用。

result 是外部函数返回的结果,由 restype 属性指明。

func 是外部函数对象本身,这样就允许重新使用相同的可调用对象来对多个函数进行检查或后续处理。

arguments 是一个包含最初传递给函数调用的形参的元组,这样就允许对所用参数的行为进行特别处理。

此函数所返回的对象将会由外部函数调用返回,但它还可以在外部函数调用失败时检查结果并引发异常。

此异常会在外部函数无法对某个传入参数执行转换时被引发。

外部函数也可通过实例化函数原型来创建。 函数原型类似于 C 中的函数原型;它们在不定义具体实现的情况下描述了一个函数(返回类型、参数类型、调用约定)。 工厂函数必须使用函数所需要的结果类型和参数类型来调用,并可被用作装饰器工厂函数,在此情况下可以通过 @wrapper 语法应用于函数。 请参阅 了解有关示例。

返回的函数原型会创建使用标准 C 调用约定的函数。 该函数在调用过程中将释放 GIL。 如果 use_errno 设为真值,则在调用之前和之后系统 变量的 ctypes 私有副本会与真正的 值进行交换;use_last_error 会为 Windows 错误码执行同样的操作。

返回的函数原型会创建使用 Python 调用约定的函数。 该函数在调用过程中将 不会 释放 GIL。

这些工厂函数所创建的函数原型可通过不同的方式来实例化,具体取决于调用中的类型与数量:

在指定地址上返回一个外部函数,地址值必须为整数。

返回由一个共享库导出的外部函数。 func_spec 必须为一个 2 元组 (name_or_ordinal, library)。 第一项是字符串形式的所导出函数名称,或小整数形式的所导出函数序号。 第二项是该共享库实例。

返回将调用一个 COM 方法的外部函数。 vtbl_index 虚拟函数表中的索引。 name 是 COM 方法的名称。 iid 是可选的指向接口标识符的指针,它被用于扩展的错误报告。

COM 方法使用特殊的调用约定:除了在 argtypes 元组中指定的形参,它们还要求一个指向 COM 接口的指针作为第一个参数。

可选的 paramflags 形参会创建相比上述特性具有更多功能的外部函数包装器。

此元组中的每一项都包含有关形参的更多信息,它必须为包含一个、两个或更多条目的元组。

第一项是包含形参指令旗标组合的整数。

指定函数的一个输入形参。

输出形参。 外部函数会填入一个值。

默认为整数零值的输入形参。

可选的第二项是字符串形式的形参名称。 如果指定此项,则可以使用该形参名称来调用外部函数。

可选的第三项是该形参的默认值。

这个例子演示了如何包装 Windows 的 MessageBoxW 函数以使其支持默认形参和已命名参数。 相应 windows 头文件的 C 声明是这样的:

现在 MessageBox 外部函数可以通过以下方式来调用:

第二个例子演示了输出形参。 这个 win32 GetWindowRect 函数通过将指定窗口的维度拷贝至调用者必须提供的 RECT 结构体来提取这些值。 这是相应的 C 声明:

带有输出形参的函数如果输出形参存在单一值则会自动返回该值,或是当输出形参存在多个值时返回包含这些值的元组,因此当 GetWindowRect 被调用时现在将返回一个 RECT 实例。

输出形参可以与 errcheck 协议相结合以执行进一步的输出处理与错误检查。 Win32 GetWindowRect API 函数返回一个 BOOL 来表示成功或失败,因此此函数可执行错误检查,并在 API 调用失败时引发异常:

如果 errcheck 不加更改地返回它所接收的参数元组,则 会继续对输出形参执行常规处理。 如果你希望返回一个窗口坐标的元组而非 RECT 实例,你可以从函数中提取这些字段并返回它们,常规处理将不会再执行:

以整数形式返回内存缓冲区地址。 obj 必须为一个 ctypes 类型的实例。

返回指向 obj 的轻量指针,该对象必须为一个 ctypes 类型的实例。 offset 默认值为零,且必须为一个将被添加到内部指针值的整数。

返回的对象只能被用作外部函数调用形参。 它的行为类似于 pointer(obj),但构造起来要快很多。

此函数类似于 C 的强制转换运算符。 它返回一个 type 的新实例,该实例指向与 obj 相同的内存块。 type 必须为指针类型,而 obj 必须为可以被作为指针来解读的对象。

此函数会创建一个可变的字符缓冲区。 返回的对象是一个 的 ctypes 数组。

init_or_size 必须是一个指明数组大小的整数,或者是一个将被用来初始化数组条目的字节串对象。

如果将一个字节串对象指定为第一个参数,则将使缓冲区大小比其长度多一项以便数组的最后一项为一个 NUL 终结符。 可以传入一个整数作为第二个参数以允许在不使用字节串长度的情况下指定数组大小。

此函数会创建一个可变的 unicode 字符缓冲区。 返回的对象是一个 的 ctypes 数组。

init_or_size 必须是一个指明数组大小的整数,或者是一个将被用来初始化数组条目的字符串。

如果将一个字符串指定为第一个参数,则将使缓冲区大小比其长度多一项以便数组的最后一项为一个 NUL 终结符。 可以传入一个整数作为第二个参数以允许在不使用字符串长度的情况下指定数组大小。

尝试寻找一个库并返回路径名称。 name 是库名称并且不带任何前缀如 lib 以及后缀如 .so.dylib 或版本号(形式与 posix 链接器选项 -l 所用的一致)。 如果找不到库,则返回 None

确切的功能取决于系统。

仅限 Windows:返回 Python 以及扩展模块所使用的 VC 运行时库的文件名。 如果无法确定库名称,则返回 None

如果你需要通过调用 free(void *) 来释放内存,例如某个扩展模块所分配的内存,重要的一点是你应当使用分配内存的库中的函数。

返回调用线程中系统 变量的 ctypes 私有副本的当前值。

与标准 C memset 库函数相同:将位于地址 dst 的内存块用 count 个字节的 c 值填充。 dst 必须为指定地址的整数或 ctypes 实例。

这个工厂函数创建并返回一个新的 ctypes 指针类型。 指针类型会被缓存并在内部重用,因此重复调用此函数耗费不大。 type 必须为 ctypes 类型。

此函数会创建一个新的指向 obj 的指针实例。 返回的对象类型为 POINTER(type(obj))

注意:如果你只是想向外部函数调用传递一个对象指针,你应当使用更为快速的 byref(obj)

此函数可改变 obj 的内部内存缓冲区大小,其参数必须为 ctypes 类型的实例。 没有可能将缓冲区设为小于对象类型的本机大小值,该值由 sizeof(type(obj)) 给出,但将缓冲区加大则是可能的。

设置调用线程中系统 变量的 ctypes 私有副本的当前值为 value 并返回原来的值。

返回 ctypes 类型或实例的内存缓冲区以字节表示的大小。 其功能与 C sizeof 运算符相同。

此函数返回从内存地址 address 开始的以字节串表示的 C 字符串。 如果指定了 size,则将其用作长度,否则将假定字符串以零值结尾。

仅限 Windows:此函数可能是 ctypes 中名字起得最差的函数。 它会创建一个 OSError 的实例。 如果未指定 code,则会调用 GetLastError 来确定错误码。 如果未指定 descr,则会调用 来获取错误的文本描述。

此函数返回从内存地址 address 开始的以字符串表示的宽字节字符串。 如果指定了 size,则将其用作字符串中的字符数量,否则将假定字符串以零值结尾。

这个非公有类是所有 ctypes 数据类型的共同基类。 另外,所有 ctypes 类型的实例都包含一个存放 C 兼容数据的内存块;该内存块的地址可由 辅助函数返回。 还有一个实例变量被公开为 ;此变量包含其他在内存块包含指针的情况下需要保持存活的 Python 对象。

ctypes 数据类型的通用方法,它们都是类方法(严谨地说,它们是 的方法):

此方法返回一个共享 source 对象缓冲区的 ctypes 实例。 source 对象必须支持可写缓冲区接口。 可选的 offset 形参指定以字节表示的源缓冲区内偏移量;默认值为零。 如果源缓冲区不够大则会引发 。

此方法创建一个 ctypes 实例,从 source 对象缓冲区拷贝缓冲区,该对象必须是可读的。 可选的 offset 形参指定以字节表示的源缓冲区内偏移量;默认值为零。 如果源缓冲区不够大则会引发 。

此方法会使用 address 所指定的内存返回一个 ctypes 类型的实例,该参数必须为一个整数。

此方法会将 obj 适配为一个 ctypes 类型。 它调用时会在当该类型存在于外部函数的 argtypes 元组时传入外部函数调用所使用的实际对象;它必须返回一个可被用作函数调用参数的对象。

所有 ctypes 数据类型都带有这个类方法的默认实现,它通常会返回 obj,如果该对象是此类型的实例的话。 某些类型也能接受其他对象。

此方法返回一个由共享库导出的 ctypes 类型。 name 为导出数据的符号名称,library 为所加载的共享库。

ctypes 数据类型的通用实例变量:

有时 ctypes 数据实例并不拥有它们所包含的内存块,它们只是共享了某个基对象的部分内存块。 只读成员是拥有内存块的根 ctypes 对象。

这个只读变量在 ctypes 数据实例自身已分配了内存块时为真值,否则为假值。

这个成员或者为 None,或者为一个包含需要保持存活以使内存块的内存保持有效的 Python 对象的字典。 这个对象只是出于调试目的而对外公开;绝对不要修改此字典的内容。

这个非公有类是所有基本 ctypes 数据类型的基类。 它在这里被提及是因为它包含基本 ctypes 数据类型共有的属性。 是 的子类,因此继承了其方法和属性。 非指针及不包含指针的 ctypes 数据类型现在将可以被封存。

这个属性包含实例的实际值。 对于整数和指针类型,它是一个整数,对于字符类型,它是一个单字符字符串对象或字符串,对于字符指针类型,它是一个 Python 字节串对象或字符串。

当从 ctypes 实例提取 value 属性时,通常每次会返回一个新的对象。 并 没有 实现原始对象返回,它总是会构造一个新的对象。 所有其他 ctypes 对象实例也同样如此。

基本数据类型当作为外部函数调用结果被返回或者作为结构字段成员或数组项被提取时,会透明地转换为原生 Python 类型。 换句话说,如果某个外部函数具有 的 restype,你将总是得到一个 Python 字节串对象,而 不是 一个 实例。

基本数据类型的子类并 没有 继续此行为。 因此,如果一个外部函数的 restype 是 的一个子类,你将从函数调用得到一个该子类的实例。 当然,你可以通过访问 value 属性来获取指针的值。

代表 C signed char 数据类型,并将值解读为一个小整数。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C char 数据类型,并将值解读为单个字符。 该构造器接受一个可选的字符串初始化器,字符串的长度必须恰好为一个字符。

当指向一个以零为结束符的字符串时代表 C char* 数据类型。 对于通用字符指针来说也可能指向二进制数据,必须要使用 POINTER(c_char)。 该构造器接受一个整数地址,或者一个字节串对象。

代表 C double 数据类型。 该构造器接受一个可选的浮点数初始化器。

代表 C float 数据类型。 该构造器接受一个可选的浮点数初始化器。

代表 C signed int 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。 在 sizeof(int) == sizeof(long) 的平台上它是 的一个别名。

代表 C signed long 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C signed long long 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C signed short 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C unsigned char 数据类型,它将值解读为一个小整数。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C unsigned long 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C unsigned long long 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C unsigned short 数据类型。 该构造器接受一个可选的整数初始化器;不会执行溢出检查。

代表 C void* 类型。 该值被表示为整数形式。 该构造器接受一个可选的整数初始化器。

代表 C wchar_t 数据类型,并将值解读为一单个字符的 unicode 字符串。 该构造器接受一个可选的字符串初始化器,字符串的长度必须恰好为一个字符。

代表 C wchar_t* 数据类型,它必须为指向以零为结束符的宽字符串的指针。 该构造器接受一个整数地址或者一个字符串。

代表 C bool 数据类型 (更准确地说是 C99 _Bool)。 它的值可以为 TrueFalse,并且该构造器接受任何具有逻辑值的对象。

Windows 专属:代表一个 HRESULT 值,它包含某个函数或方法调用的成功或错误信息。

代表 C * 数据类型。 不带参数地调用此构造器将创建一个 NULL * 指针。

本机字节序的联合所对应的抽象基类。

大端 字节序的结构体所对应的抽象基类。

小端 字节序的结构体所对应的抽象基类。

非本机字节序的结构体不能包含指针类型字段,或任何其他包含指针类型字段的数据类型。

本机 字节序的结构体所对应的抽象基类。

实际的结构体和联合类型必须通过子类化这些类型之一来创建,并且至少要定义一个 类变量。 将创建 ,它允许通过直接属性访问来读取和写入字段。 这些是

一个定义结构体字段的序列。 其中的条目必须为 2 元组或 3 元组。 元组的第一项是字段名称,第二项指明字段类型;它可以是任何 ctypes 数据类型。

对于整数类型字段例如 ,可以给定第三个可选项。 它必须是一个定义字段比特位宽度的小正整数。

字段名称在一个结构体或联合中必须唯一。 不会检查这个唯一性,但当名称出现重复时将只有一个字段可被访问。

可以在定义 Structure 子类的类语句 之后 再定义 类变量,这将允许创建直接或间接引用其自身的数据类型:

但是, 类变量必须在类型第一次被使用(创建实例,调用 等等)之前进行定义。 在此之后对

可以定义结构体类型的子类,它们会继承基类的字段再加上在子类中定义的任何 。

一个可选的小整数,它允许覆盖实体中结构体字段的对齐方式。 当 被赋值时必须已经定义了 ,否则它将没有效果。

一个可选的序列,它会列出未命名(匿名)字段的名称。 当 被赋值时必须已经定义了 ,否则它将没有效果。

在此变量中列出的字段必须为结构体或联合类型字段。 将在结构体类型中创建描述器以允许直接访问嵌套字段,而无需创建对应的结构体或联合字段。

以下是一个示例类型(Windows):

TYPEDESC 结构体描述了一个 COM 数据类型,vt 字段指明哪个联合字段是有效的。 由于 u 字段被定义为匿名字段,现在可以直接从 TYPEDESC 实例访问成员。 td.lptdesctd.u.lptdesc 是等价的,但前者速度更快,因为它不需要创建临时的联合实例:

可以定义结构体的子类,它们会继承基类的字段。 如果子类定义具有单独的 变量,在其中指定的字段会被添加到基类的字段中。

结构体和联合的构造器均可接受位置和关键字参数。 位置参数用于按照 中的出现顺序来初始化成员字段。 构造器中的关键字参数会被解读为属性赋值,因此它们将以相应的名称来初始化 ,或为不存在于 中的名称创建新的属性。

创建实际数组类型的推荐方式是通过将任意 类型与一个正整数相乘。 作为替代方式,你也可以子类化这个类型并定义 和 类变量。 数组元素可使用标准的抽取和切片方式来读写;对于切片读取,结果对象本身 并非 一个 。

一个指明数组中元素数量的正整数。 超出范围的抽取会导致 。 该值将由 返回。

指明数组中每个元素的类型。

Array 子类构造器可接受位置参数,用来按顺序初始化元素。

私有对象,指针的抽象基类。

实际的指针类型是通过调用 并附带其将指向的类型来创建的;这会由 自动完成。

如果一个指针指向的是数组,则其元素可使用标准的抽取和切片方式来读写。 指针对象没有长度,因此 将引发 。 抽取负值将会从指针 之前 的内存中读取(与 C 一样),并且超出范围的抽取将可能因非法访问而导致崩溃(视你的运气而定)。

返回指针所指向的对象。 对此属性赋值会使指针改为指向所赋值的对象。

我要回帖

更多关于 python中的numpy模块 的文章

 

随机推荐