我试图使用ctypes中的find_library()命令,但是我得到了一个错误,我不明白它的原因。我在窗户上工作
这是代码:
import ctypes
from ctypes.util import find_library
import numpy
from string import atoi
from time import sleep
# Class constants
#nidaq = ctypes.windll.nicaiu
nidaq = ctypes.cdll.LoadLibrary(find_library('NIDAQmx'))
这就是我得到的错误:
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
nidaq = ctypes.cdll.LoadLibrary(find_library('NIDAQmx'))
File "C:\Python27\lib\ctypes\__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
TypeError: expected string or Unicode object, NoneType found
我是否应该将NIDAQmx放在一个特定的位置,例如,以便可以找到它?或者这是无关的?
谢谢!
您要搜索的库位于计算机上的公用位置。
find_library
不会对文件系统执行任意搜索,它会在列出ctypes/macholib/dyld.py
模块的特定位置查找(请参阅dyld_find
函数)。如果库位于例如
/usr/lib
的位置,则应该找到它,但如果它位于非标准位置,则必须将其目录添加到诸如DYLD_LIBRARY_PATH
的环境变量中。在Windows上,
find_library
搜索PATH
环境变量中的目录,这不是Windows加载程序使用的真正的search order for desktop applications。值得注意的是find_library
不包括应用程序目录和当前目录。调用Windows
SearchPath
会更接近,但给定DLL activation contexts和其他api(如SetDllDirectory
)或较新的apiSetDefaultDllDirectories
和AddDllDirectory
)则不会更接近。如果没有简单的方法复制Windows加载程序使用的搜索,只需使用
CDLL
(cdecl)或WinDLL
(stdcall)按名称加载DLL:可以在运行时动态地将DLL目录添加到
PATH
(与启动时Linux加载程序缓存LD_LIBRARY_PATH
不同)。例如,假设您的DLL依赖项位于包的“dlls”子目录中。可以按如下方式预先设置此目录:或者,可以使用调用^{} 和^{} 的上下文管理器临时修改当前工作目录通常占用的搜索槽。记住,就像修改
PATH
一样,这会修改全局进程数据,因此在使用多个线程时应小心。这种方法的一个优点是它不修改CreateProcess
用于查找可执行文件的搜索路径。例如:
当然,如果您只想在启动时设置一次DLL目录,问题会简单得多。直接调用
SetDllDirectoryW
。另一种方法是使用标记
LOAD_WITH_ALTERED_SEARCH_PATH
调用LoadLibraryEx
,这会临时将加载的DLL目录添加到搜索路径中。需要使用绝对路径加载DLL,否则行为未定义。为了方便起见,我们可以子类ctypes.CDLL
和ctypes.WinDLL
来调用LoadLibraryEx
,而不是LoadLibrary
。以下是所有可用的
LoadLibraryEx
标志:例如:
相关问题 更多 >
编程相关推荐