我尝试在ctypes中使用windll.LoadLibrary将dll文件导入python。虽然没有任何错误消息,但是头文件中列出的所有函数似乎都没有成功加载。我想知道dll文件是否有任何问题,或者我错误地使用了windll.LoadLibrary方法。
可以从以下链接下载dll和头文件: http://www.cc.ncu.edu.tw/~auda/ATC3DG.rar
我使用的python命令是:
from ctypes import *
libc=windll.LoadLibrary('ATC3DG.DLL')
可以从以下链接查看结果,显示dir(libc)没有给我ATC3DG.h中列出的任何函数或变量:
http://www.cc.ncu.edu.tw/~auda/ATC3DG.jpg
我在Windows 7(64位)平台上使用python 2.7.3(32位)和ipython 0.13.1。
谢谢,
张小姐答案 0 :(得分:0)
除非您已经访问过该功能,否则在使用dir
时它们不会显示。例如:
In [98]: from ctypes import cdll
In [99]: libc = cdll.LoadLibrary('libc.so.6')
In [100]: dir(libc)
Out[100]:
['_FuncPtr',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattr__',
'__getattribute__',
'__getitem__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_func_flags_',
'_func_restype_',
'_handle',
'_name']
In [101]: libc.printf
Out[101]: <_FuncPtr object at 0x65a12c0>
In [102]: dir(libc)
Out[102]:
['_FuncPtr',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattr__',
'__getattribute__',
'__getitem__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_func_flags_',
'_func_restype_',
'_handle',
'_name',
'printf']
您可以通过查看CDLL.__getitem__
和CDLL.__getattr__
方法了解原因:
class CDLL(object):
# ...
def __getattr__(self, name):
if name.startswith('__') and name.endswith('__'):
raise AttributeError(name)
func = self.__getitem__(name)
setattr(self, name, func)
return func
def __getitem__(self, name_or_ordinal):
func = self._FuncPtr((name_or_ordinal, self))
if not isinstance(name_or_ordinal, (int, long)):
func.__name__ = name_or_ordinal
return func