2015-12-10 2 views
0

Я пытаюсь запустить пример программы анализатора спектра, но у него возникают проблемы с поиском модуля. Здесь ошибка я получаюПроблемы с использованием 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 с этим путем, так что я не уверен, что проблема есть. Кто-нибудь знает, что с этим не так?

+0

Вы пытались установить текущий каталог в эту папку до его использования? –

+0

@MartinEvans Нет У меня нет, но это не должно иметь значения с полным пути к файлу, если это так? – SirParselot

+1

DLL может иметь иждивенцев в этой папке. Перед его использованием стоит попробовать нечто вроде 'os.chdir (r'C: \ Tektronix \ RSA306 API \ lib \\ x64 ')'). –

ответ

2

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) 
+0

Это немного более дружественный поток для вызова ['SetDllDirectory'] (https://msdn.microsoft.com/en-us/library/ ms686203) или добавить каталог в переменную среды PATH, например 'os.environ ['PATH'] + = os.pathsep + dlldir'. Они также не являются потокобезопасными, поскольку они изменяют глобальное состояние, но они менее плохи, чем изменение рабочего каталога. Гораздо лучше называть ['LoadLibraryEx'] (https://msdn.microsoft.com/en-us/library/ms684179) с помощью' LOAD_WITH_ALTERED_SEARCH_PATH' и вручную переносить дескриптор DLL в экземпляр 'WinDLL'. Python использует этот подход для загрузки расширений. – eryksun

+0

@eryksun Не могли бы вы объяснить, как вы обертываете дескриптор в экземпляре 'WinDLL'? Я получил возвращаемое значение из 'LoadLibraryEx', которое является int, но' WinDLL' принимает строку или объект unicode. – SirParselot

+0

'LoadLibraryEx' возвращает дескриптор, это может быть передано' WinDLL', используя 'handle = xxxx' в качестве одного из аргументов. –

1

инженер приложения Tektronix здесь.

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") 

Вот ссылка, чтобы загрузить последнюю версию API RSA (по состоянию на 11/1/16) : http://www.tek.com/model/rsa306-software

Вот эта ссылка для скачивания документации по API (начиная с 11/1/16). В этом документе прилагается электронная таблица Excel, которая описывает различия между старыми функциями и новыми функциями: http://www.tek.com/spectrum-analyzer/rsa306-manual-6

Смежные вопросы