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