使用 ctypes.WinDLL() 的问题
Issues using ctypes.WinDLL()
我正在尝试让频谱分析仪程序示例正常工作,但它在查找模块时遇到问题。这是我收到的错误
Traceback (most recent call last):
File "C:\Users\user\Documents\Programs\Python_program_example.py", line 10, in <module>
rsa300 = ctypes.WinDLL("C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
DLL 存在并且 os.path.exists()
使用该路径打印 true
所以我不确定问题出在哪里。有谁知道这有什么问题?
RSA300API.DLL
可能在文件夹中有依赖,所以在使用它之前,使用os.chdir
设置工作目录,例如:
import os
os.chdir(r'C:\Tektronix\RSA306 API\lib\x64')
rsa300 = ctypes.WinDLL(r"C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")
检查其中一项 samples,这似乎是推荐的访问方式。
或者,正如@eryksub 提到的,可以使用 LoadLibraryEx
。 win32api
可用于获取句柄并将其传递给 WinDLL
,如下所示:
import ctypes
import win32api
import win32con
dll_name = r'C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll'
dll_handle = win32api.LoadLibraryEx(dll_name, 0, win32con.LOAD_WITH_ALTERED_SEARCH_PATH)
rsa300 = ctypes.WinDLL(dll_name, handle=dll_handle)
这里是泰克应用工程师。
Martin 是正确的,我们的 dll 确实 在它所在的文件夹中有依赖项。看起来您使用的是我们 API 的旧版本,它在 C:\Tektronix\RSA306 API\lib\x64 文件夹中有一大堆依赖项。 API 的较新版本清除并整合了许多这些依赖项,并重命名了许多功能以提高清晰度和一致性。我们的软件工程师还决定在安装新版本时不会覆盖旧的 API,因此即使您安装了最新的 API.
,您的旧脚本仍然可以工作
FWIW,我在所有 RSA 控制脚本的开头使用以下代码:
"""
################################################################
C:\Tektronix\RSA306 API\lib\x64 needs to be added to the
PATH system environment variable
################################################################
"""
os.chdir("C:\Tektronix\RSA_API\lib\x64")
rsa = cdll.LoadLibrary("RSA_API.dll")
这里是 link 下载最新版本的 RSA API(截至 2016 年 11 月 1 日):
http://www.tek.com/model/rsa306-software
这里是 link 下载 API 文档(截至 2016 年 11 月 1 日)。本文档附有一个 Excel 电子表格,概述了旧函数和新函数之间的区别:
http://www.tek.com/spectrum-analyzer/rsa306-manual-6
我正在尝试让频谱分析仪程序示例正常工作,但它在查找模块时遇到问题。这是我收到的错误
Traceback (most recent call last):
File "C:\Users\user\Documents\Programs\Python_program_example.py", line 10, in <module>
rsa300 = ctypes.WinDLL("C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
DLL 存在并且 os.path.exists()
使用该路径打印 true
所以我不确定问题出在哪里。有谁知道这有什么问题?
RSA300API.DLL
可能在文件夹中有依赖,所以在使用它之前,使用os.chdir
设置工作目录,例如:
import os
os.chdir(r'C:\Tektronix\RSA306 API\lib\x64')
rsa300 = ctypes.WinDLL(r"C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")
检查其中一项 samples,这似乎是推荐的访问方式。
或者,正如@eryksub 提到的,可以使用 LoadLibraryEx
。 win32api
可用于获取句柄并将其传递给 WinDLL
,如下所示:
import ctypes
import win32api
import win32con
dll_name = r'C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll'
dll_handle = win32api.LoadLibraryEx(dll_name, 0, win32con.LOAD_WITH_ALTERED_SEARCH_PATH)
rsa300 = ctypes.WinDLL(dll_name, handle=dll_handle)
这里是泰克应用工程师。
Martin 是正确的,我们的 dll 确实 在它所在的文件夹中有依赖项。看起来您使用的是我们 API 的旧版本,它在 C:\Tektronix\RSA306 API\lib\x64 文件夹中有一大堆依赖项。 API 的较新版本清除并整合了许多这些依赖项,并重命名了许多功能以提高清晰度和一致性。我们的软件工程师还决定在安装新版本时不会覆盖旧的 API,因此即使您安装了最新的 API.
,您的旧脚本仍然可以工作FWIW,我在所有 RSA 控制脚本的开头使用以下代码:
"""
################################################################
C:\Tektronix\RSA306 API\lib\x64 needs to be added to the
PATH system environment variable
################################################################
"""
os.chdir("C:\Tektronix\RSA_API\lib\x64")
rsa = cdll.LoadLibrary("RSA_API.dll")
这里是 link 下载最新版本的 RSA API(截至 2016 年 11 月 1 日): http://www.tek.com/model/rsa306-software
这里是 link 下载 API 文档(截至 2016 年 11 月 1 日)。本文档附有一个 Excel 电子表格,概述了旧函数和新函数之间的区别: http://www.tek.com/spectrum-analyzer/rsa306-manual-6