OSError: [WinError 127] при попытке загрузить DLL исправлено путем изменения среды [Python] - PullRequest
1 голос
/ 07 августа 2020

Я пытался заставить библиотеку синтаксического анализа tree-sitter работать в моем проекте в 64-битной среде python с использованием существующей привязки python - к сожалению, безрезультатно. Проблема github указанного репо с привязкой python упоминала, что библиотека совместима только с 32-битными python версиями. Поскольку библиотеке необходимо сначала скомпилировать синтаксический анализатор в DLL, прежде чем что-либо анализировать, я установил MinGW как 32-битный C (++) компилятор и смог скомпилировать синтаксический анализатор. Однако при попытке загрузить DLL я получил следующую ошибку:

File "D:\Projekte\Idea\Crawler\venv37\lib\site-packages\tree_sitter\__init__.py",
 line 81, in __init__
     self.lib = cdll.LoadLibrary(library_path)  
File "C:\Program Files (x86)\Python37\lib\ctypes\__init__.py", line 442, in LoadLibrary      
     return self._dlltype(name)     
File "C:\Program Files (x86)\Python37\lib\ctypes\__init__.py", line 364, in __init__
     self._handle = _dlopen(self._name, mode) 
OSError: [WinError 127] Die angegebene Prozedur wurde nicht gefunden 

После небольшого поиска в SO мне удалось исправить ошибку, добавив os.environ['PATH'] = "C:/MinGW/bin" + ';' + os.environ['PATH'] в свой код, прежде чем пытаться загрузить DLL. Я предполагаю, что это связано с тем, что я использовал MinGW для компиляции DLL в первую очередь. ( для завершения: я изменил некоторые строки кода в Python37 / lib / distutils / cygwinccompiler.py , чтобы python фактически использовал соответствующий компилятор, а именно изменил linker_so исполняемый файл в классе Mingw32CCompiler в "g ++ -shared" и добавление

elif msc_ver == '1926':
    # Visual Studio 2015 / Visual C++ 14.0
    # "msvcr140.dll no longer exists" http://blogs.msdn.com/b/vcblog/archive/2014/06/03/visual-studio-14-ctp.aspx
    return ['vcruntime140']

в get_msvcr() )

Тем не менее, я не совсем уверен почему это исправляет ошибку, и попытка использовать отладчик для go через трассировку стека только потеряла меня в бесчисленных заглушках в ctypes/__init__.py. Я подумал, что этот пост может помочь другим, столкнувшимся с подобной ошибкой, и мне лучше понять, что, черт возьми, происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...