在Python中使用ctypes时,为什么必须用大写字母调用CDLL?

2024-10-05 17:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试加载一些我想通过Python脚本控制的硬件的专有DLL。为此,我使用了ctypes包中的CDLL模块。我遇到了一个奇怪的问题,调用CDLL时必须大写,否则函数调用不起作用

执行以下操作会引发错误:

from ctypes import CDLL

mcldll = cdll(r'C:\Program Files\Mad City Labs\NanoDrive\Madlib.dll')    # using lower case


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-4ef065672c09> in <module>
      1 from ctypes import CDLL
      2 
----> 3 mcldll = cdll(r'C:\Program Files\Mad City Labs\NanoDrive\Madlib.dll')

TypeError: 'LibraryLoader' object is not callable

但这样做很好:

from ctypes import CDLL

mcldll = CDLL(r'C:\Program Files\Mad City Labs\NanoDrive\Madlib.dll')    # using upper case

这是我第一次在Python中导入或调用模块时遇到区分大小写的问题。是什么导致了这种行为


Tags: 模块fromimportcityfilesprogramctypesdll
1条回答
网友
1楼 · 发布于 2024-10-05 17:23:24

所有Python都区分大小写。您似乎注意到的是,python类或函数在所有CAP中都是不常见的

根据Python PEP指南(https://www.python.org/dev/peps/pep-0008/#class-names)“类名通常应使用大写字母约定。”

在ctypes的源代码中,我们可以看到CDLL只是一个类定义

#line 318 of ctypes/__init__.py
class CDLL(object):
    """An instance of this class represents a loaded dll/shared
    library, exporting functions using the standard C calling
    convention (named 'cdecl' on Windows).

因此,这似乎很不寻常。我想问题是如何正确地用大写字母“C DLL”这个词。所以他们碰巧选择了“CDLL”

此外,CDLL是一个类名,而不是一个模块名(全部为小写https://www.python.org/dev/peps/pep-0008/#package-and-module-names

Edit:作为对下面评论的回应,在ctypes中似乎有一个全小写的对象cdll。我不是ctypes方面的专家,但这似乎是加载库的另一种方法

我不完全确定API的区别,但小写cdll用于以下语法:

from ctypes import cdll # lowercase
cdll.LoadLibrary("libc.so.6")

有关详细信息,请参阅完整文档(https://docs.python.org/3/library/ctypes.html

相关问题 更多 >