ctypes 中的 find_library()

2024-01-12

我正在尝试使用 ctypes 中的命令 find_library() 但出现错误,我不明白其原因。我正在 Windows 上工作

这是代码:

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 放置在特定位置以便可以找到它?或者这无关?

Thanks!


在 Windows 上,find_library搜索目录中的PATH环境变量,这不是真实的桌面应用程序的搜索顺序 http://msdn.microsoft.com/en-us/library/ms682586#search_order_for_desktop_applications由 Windows 加载程序使用。尤其find_library不包括应用程序目录和当前目录。

调用WindowsSearchPath会更接近,但给定 DLL 也不会更接近激活上下文 https://msdn.microsoft.com/en-us/library/aa374153以及其他 API,例如SetDllDirectory或较新的 APISetDefaultDllDirectories and AddDllDirectory.

鉴于没有简单的方法来复制 Windows 加载程序使用的搜索,只需使用以下任一方法按名称加载 DLLCDLL(cdecl) 或WinDLL(标准调用):

nidaq_cdecl   = ctypes.CDLL('NIDAQmx')
nidaq_stdcall = ctypes.WinDLL('NIDAQmx')

您可以将DLL目录添加到PATH在运行时动态地(与 Linux 加载器的缓存相反)LD_LIBRARY_PATH启动时)。例如,假设您的 DLL 依赖项位于包的“dlls”子目录中。您可以按如下方式添加此目录:

import os

basepath = os.path.dirname(os.path.abspath(__file__))
dllspath = os.path.join(basepath, 'dlls')
os.environ['PATH'] = dllspath + os.pathsep + os.environ['PATH']

或者,您可以使用上下文管理器来调用GetDllDirectory https://msdn.microsoft.com/en-us/library/ms683186 and SetDllDirectory https://msdn.microsoft.com/en-us/library/ms686203临时修改当前工作目录通常占用的搜索槽。请记住,就像修改一样PATH,这会修改全局进程数据,所以使用多线程时要小心。这种方法的一个优点是它不会修改搜索路径CreateProcess用于查找可执行文件。

import os
import ctypes
from ctypes import wintypes
from contextlib import contextmanager

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

def check_dword(result, func, args):
    if result == 0:
        last_error = ctypes.get_last_error()
        if last_error != 0:
            raise ctypes.WinError(last_error)
    return args

def check_bool(result, func, args):
    if not result:
        last_error = ctypes.get_last_error()
        if last_error != 0:
            raise ctypes.WinError(last_error)
        else:
            raise OSError
    return args

kernel32.GetDllDirectoryW.errcheck = check_dword
kernel32.GetDllDirectoryW.argtypes = (wintypes.DWORD,  # _In_  nBufferLength
                                      wintypes.LPWSTR) # _Out_ lpBuffer

kernel32.SetDllDirectoryW.errcheck = check_bool
kernel32.SetDllDirectoryW.argtypes = (wintypes.LPCWSTR,) # _In_opt_ lpPathName

@contextmanager
def use_dll_dir(dll_dir):
    size = newsize = 0
    while newsize >= size:
        size = newsize
        prev = (ctypes.c_wchar * size)()
        newsize = kernel32.GetDllDirectoryW(size, prev)
    kernel32.SetDllDirectoryW(os.path.abspath(dll_dir))
    try:
        yield
    finally:
        kernel32.SetDllDirectoryW(prev)

例如:

if __name__ == '__main__':
    basepath = os.path.dirname(os.path.abspath(__file__))
    dllspath = os.path.join(basepath, 'dlls')
    with use_dll_dir(dllspath):
        nidaq = ctypes.CDLL('NIDAQmx')

当然,如果您只想在启动时设置一次 DLL 目录,那么问题就简单得多。只需致电SetDllDirectoryW直接地。


另一种方法是调用LoadLibraryEx与旗帜LOAD_WITH_ALTERED_SEARCH_PATH,这会临时将加载的 DLL 目录添加到搜索路径中。您需要使用绝对路径加载 DLL,否则行为未定义。为了方便起见,我们可以子类化ctypes.CDLL and ctypes.WinDLL打电话LoadLibraryEx代替LoadLibrary.

import ctypes
from ctypes import wintypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

def check_bool(result, func, args):
    if not result:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

kernel32.LoadLibraryExW.errcheck = check_bool
kernel32.LoadLibraryExW.restype = wintypes.HMODULE
kernel32.LoadLibraryExW.argtypes = (wintypes.LPCWSTR,
                                    wintypes.HANDLE,
                                    wintypes.DWORD)

class CDLLEx(ctypes.CDLL):
    def __init__(self, name, mode=0, handle=None, 
                 use_errno=True, use_last_error=False):
        if handle is None:
            handle = kernel32.LoadLibraryExW(name, None, mode)
        super(CDLLEx, self).__init__(name, mode, handle,
                                     use_errno, use_last_error)

class WinDLLEx(ctypes.WinDLL):
    def __init__(self, name, mode=0, handle=None, 
                 use_errno=False, use_last_error=True):
        if handle is None:
            handle = kernel32.LoadLibraryExW(name, None, mode)
        super(WinDLLEx, self).__init__(name, mode, handle,
                                       use_errno, use_last_error)

这是所有可用的LoadLibraryEx flags:

DONT_RESOLVE_DLL_REFERENCES         = 0x00000001
LOAD_LIBRARY_AS_DATAFILE            = 0x00000002
LOAD_WITH_ALTERED_SEARCH_PATH       = 0x00000008
LOAD_IGNORE_CODE_AUTHZ_LEVEL        = 0x00000010  # NT 6.1
LOAD_LIBRARY_AS_IMAGE_RESOURCE      = 0x00000020  # NT 6.0
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE  = 0x00000040  # NT 6.0

# These cannot be combined with LOAD_WITH_ALTERED_SEARCH_PATH.
# Install update KB2533623 for NT 6.0 & 6.1.
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR    = 0x00000100
LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200
LOAD_LIBRARY_SEARCH_USER_DIRS       = 0x00000400
LOAD_LIBRARY_SEARCH_SYSTEM32        = 0x00000800
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS    = 0x00001000

例如:

if __name__ == '__main__':
    basepath = os.path.dirname(os.path.abspath(__file__))
    dllpath = os.path.join(basepath, 'dlls', 'NIDAQmx.dll')
    nidaq = CDLLEx(dllpath, LOAD_WITH_ALTERED_SEARCH_PATH)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ctypes 中的 find_library() 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • Webpack 源映射指向缩小包

    我正在为现有项目设置 Webpack 构建过程 并且遇到了源映射的一些问题 我在用devtool eval source map 如果浏览器中发生错误 堆栈跟踪中的每个文件 行号都指向 Webpack 包中压缩为一行的文件 例如 堆栈跟踪的
  • Android - 视图实例在屏幕旋转时获取空值

    我正在使用 Kotlin Android 扩展通过其 id 直接访问视图 我有一个进度条 我可以使用 id 直接在片段中访问它 即progress bar
  • 如何使用 Jasmine 测试 XMLHttpRequest

    如何在没有 jQuery 的情况下测试 XMLHttpRequest 或纯 Javascript AJAX 上的 onreadystatechange 我这样做是因为我正在开发 Firefox 扩展 我想我必须使用间谍 但不知道如何使用 因
  • 对端口“COM1”的访问被拒绝

    我试图打开 COM1 端口 但收到此错误消息 访问端口 COM1 被拒绝 我正在编写一个通过 NET 发送短信的程序 我预计可能会出现错误 但不应出现 访问被拒绝 错误 请给我任何解决方案 如果端口需要任何访问权限 那么我该怎么做 首先 确
  • OOAD书籍推荐:从理论到实践[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我致力于成为一名优秀的面向对象开发人员 OO 引起了我的兴趣 因为我理解模式 知道为什么组合比继承给你更
  • MVC UpdateModel 可以使用企业库 VAB 吗?

    或者我应该说 将 Enterprise Library 5 VAB 与 MVC 结合使用的最简洁方法是什么 我目前使用的形式 ActionResult Save int id FormCollection form SomeModel mo
  • Azure 容器实例在没有明显原因的情况下被终止

    我们每天运行容器实例组 由逻辑应用程序触发 容器基本上连接到队列 处理它并结束 有时 根据事件日志 容器被杀死 日志中没有任何内容 除了我们的应用程序所做的最后一件事 并且它不是在处理结束时 我检查了资源 我们远远低于限制 另外 这种情况并
  • 如何验证以下场景的表单? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对网络开发比较陌生 我的网站使用 HTML jQuery 和 PHP 我想设计一个表单并通过以下方式验证它 一个简单的网页 有输入框 2
  • pyspark - 在 Spark 会话中获得一致的随机值

    我想将一列随机值添加到数据帧 每行都有一个 id 对于我正在测试的东西 我是努力在 Spark 会话中获得可重复的结果 每个行 id 的随机值相同 我能够通过使用重现结果 from pyspark sql functions import
  • Go:如何检查一个字符串是否包含多个子字符串?

    strings Contains str to check substr 仅接受一个参数作为要检查的子字符串 如何在不使用的情况下检查多个子字符串strings Contains 反复 eg strings Contains str to
  • Ruby 和指针

    我正在为一个小游戏编写一个地下城生成器 地下城由房间组成 Aroom has connections到其他房间 room connections room a room b and room number 1 unique id 现在我需要
  • 无法在 Argo 工作流程中使用 jsonpath 函数作为输出参数

    我正在使用一个工作流程jsonpath函数用于输出参数从 json 字符串中提取特定值 但失败并出现此错误Error exit code 255 这是我的工作流程 apiVersion argoproj io v1alpha1 kind W
  • 如何处理库中需要在库外部设置的变量?

    我在多个项目中使用 Datomic 是时候将所有通用代码移动到一个小型实用程序库中了 一项挑战是处理共享数据库uri 大多数操作都依赖于它 但必须由使用该库的项目进行设置 我想知道是否有一种行之有效的方法可以做到这一点 以下是我考虑过的一些
  • 如何根据屏幕尺寸使用 jQuery 隐藏 div

    我正在编写一个响应式 WordPress 主题 并且我想根据查看器的屏幕分辨率隐藏 div 我在 div 中有一个来自 BuySellAds 的 468 像素 x 60 像素的广告横幅 我想对在智能手机或平板电脑上查看该网站的观众隐藏它 我
  • 并行进程的通信:我有哪些选择?

    我正在尝试更深入地研究 R 例程的并行化 对于一堆 工人 进程的通信 我有什么选择 沟通between各自的workers 的沟通workers与 master 过程 AFAIU 不存在 共享环境 共享内存 主进程和所有工作进程都可以访问
  • 气流如何安装?

    我好像在做某事 错误的 https pythonhosted org airflow start html https pythonhosted org airflow start html export AIRFLOW HOME airf
  • 如何在 AJAX/jQuery POST 成功时返回 PHP 变量

    如何在 PHP 中使用 AJAX 返回变量 我目前正在控制器中使用 echo 来显示价格dropdown change in a div称为价格 但是我有一个隐藏字段 我需要在更改时将行 ID 返回到该隐藏字段 如何在 jQuery 中分配
  • Plotly dash 在重新加载时刷新全局数据

    想象我有一个dash我希望在页面重新加载时刷新全局数据的应用程序 我正在使用一个函数来提供所描述的布局here https dash plotly com live updates 但是 我不确定应该如何 在哪里定义df这样我就可以在回调中
  • 动态生成条件JS

    我正在寻找在循环内动态生成条件的最佳方法 一个价值千字的示例 所以这是我的代码 var condition data label Test for var key in andArray condition andArray key for
  • ctypes 中的 find_library()

    我正在尝试使用 ctypes 中的命令 find library 但出现错误 我不明白其原因 我正在 Windows 上工作 这是代码 import ctypes from ctypes util import find library i