Windows 上的 python libclang 绑定无法从 Sublime Text 初始化翻译单元

2024-04-11

简短的介绍: using libclang自动完成代码不适用于与 Sublime Text 3 捆绑在一起的 python。

Details:一个可验证的小例子在 repo 中Github https://github.com/niosus/test-complete-plugin

本质上,有一个脚本使用了稍微改变的cindex.py(与 python 3 和 clang 3.8 兼容)并从测试源文件构建翻译单元。然后它会重新解析它并尝试完成。

该脚本在使用 Powershell 中的 Python 3.3.5 时按预期工作。

当放入 Sublime Text 3 上的 Packages 文件夹时,会产生错误。 Sublime Text 3 报告的 Python 版本是 3.3.6。错误:

Traceback (most recent call last):
  File "C:\Program Files\Sublime Text 3\sublime_plugin.py", line 78, in reload_plugin
    m = importlib.import_module(modulename)
  File "./python3.3/importlib/__init__.py", line 90, in import_module
  File "<frozen importlib._bootstrap>", line 1584, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 584, in _check_name_wrapper
  File "<frozen importlib._bootstrap>", line 1022, in load_module
  File "<frozen importlib._bootstrap>", line 1003, in load_module
  File "<frozen importlib._bootstrap>", line 560, in module_for_loader_wrapper
  File "<frozen importlib._bootstrap>", line 868, in _load_module
  File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
  File "C:\Users\igor\AppData\Roaming\Sublime Text 3\Packages\test_clang\script.py", line 21, in <module>
    tu = TU.from_source(filename=filename)
  File "C:\Users\igor\AppData\Roaming\Sublime Text 3\Packages\test_clang\clang\cindex38.py", line 2372, in from_source
    raise TranslationUnitLoadError("Error parsing translation unit.")
clang.cindex38.TranslationUnitLoadError: Error parsing translation unit.

发生这种情况是因为 libclang 返回的翻译单元的指针cindex.py is None。对我来说唯一奇怪的是,它只发生在与 sublime text 3 捆绑在一起的 python 上。

其他人也会发生这种情况吗?有谁知道可能是什么原因或如何调试它?

如果您无法运行此处提供的示例,也请随时联系我。

UPD:在测试项目的问题中,我们发现 sublime text 中捆绑的不是 ctypes。将 sublime text 中的内容替换为系统中安装的内容会产生相同的错误。

UPD2:我已经剥离了cindex.py测试存储库中的文件仅包含遇到问题中描述的相同问题所需的最少代码。也许这将有助于产生关于可能出现问题的新想法?另外,我想明确指出,相同的代码在 Linux 和 OSX 上的工作方式完全符合预期。


事实证明,此故障的可调试性非常缺乏。我跟踪了一堆 libclang 绑定源,希望找到解决周围缺乏可调试性的解决方法TranslationUnitLoadError是从 python 中抛出的。

即使您使用 ctypes,这里似乎也存在一些基本限制errcheck callback https://docs.python.org/3.7/library/ctypes.html#ctypes._FuncPtr.errcheck就像下面的...

# MODIFIED cindex.py

def errcheck_callable(result, func, arguments):
    print(f"ERROR---result={result}, func={func}, arguments={arguments}")
    import pdb
    pdb.set_trace()

functionList = [
    ...
    ("clang_parseTranslationUnit",
    [Index, c_interop_string, c_void_p, c_int, c_void_p, c_int, c_int],
    c_object_p,
    errcheck_callable, # <--- makes this dll function a bit more debugable during call to `register_function`
    ),
    ...
]

然而,翻译单元失败期间触发的错误回调中没有太多内容:

> /Users/USERX/python3.7/site-packages/clang/cindex.py(155)errcheck_callable()
-> print(f"ERROR---result={result}, func={func}, arguments={arguments}")
ERROR---result=<clang.cindex.LP_c_void_p object at 0x10b1aa9d8>, func=<_FuncPtr object at 0x10b1bf5c0>, arguments=(<clang.cindex.Index object at 0x10aea1e48>, None, <clang.cindex.c_char_p_Array_62 object at 0x10b1aa620>, 62, None, 0, 0)
(Pdb) result.contents
*** ValueError: NULL pointer access

有一个待处理的FIXME comment https://github.com/llvm/llvm-project/blob/e29a2e6be4e114b4233a2e0feedb74b2f34cf782/clang/bindings/python/clang/cindex.py#L151-L159几年前添加了有关 libclang 固有的可调试性差距的内容clang_parseTranslationUnit.

# FIXME: Make libclang expose additional error information in this scenario.

这篇文章中进行了一些讨论使用 libclang 的 Python 绑定处理解析错误 http://clang-developers.42468.n3.nabble.com/Dealing-with-parse-errors-with-Python-bindings-of-libclang-td4052953.html。最好的建议似乎来自将调试器附加到 libclang 的想法:

...您也许可以让调试器继续运行clang_parseTranslationUnit并检查那里的错误状态。


为了深入了解一些内部原理,libclang 基本上是通过 ctypes 加载到 python 中的call https://github.com/llvm/llvm-project/blob/4e85ca9562a588eba491e44bcbf73cb2f419780f/clang/bindings/python/clang/cindex.py#L4172 to cdll.LoadLibrary创建一个CDLL https://docs.python.org/3/library/ctypes.html#ctypes.CDLL实例。然后定义了一组硬编码的函数functionList因为一组元组都是通过注册的register_functions赋予它们更深的蟒蛇存在感。实际上TranslationUnitLoadError gets raised https://github.com/llvm/llvm-project/blob/4e85ca9562a588eba491e44bcbf73cb2f419780f/clang/bindings/python/clang/cindex.py#L2828-L2835类内方法TranslationUnit.from_source它直接调用该行中的 libclang 函数

ptr = conf.lib.clang_createTranslationUnit(index, fspath(filename))

我相信这是可调试性被截断的地方,因为底层source https://github.com/llvm/llvm-project/blob/7b518dcb291e740c3e957d93c2b4046bc8a97f00/clang/tools/libclang/CIndex.cpp#L3587-L3603因为 python 绑定是 C,而不是 C++,所以没有异常处理像冒泡一样SEH异常 https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.sehexception?view=netframework-4.8对于.net 来说会。使用该运行时,您可以调试非托管代码。然而这里没有等价物。

您可以跟踪翻译单元变量TU从其调用堆栈向下source https://github.com/llvm/llvm-project/blob/d4c9e13324443c0324148156d54d2c7c81393327/clang/tools/libclang/CIndex.cpp#L3587-L3603...

CXTranslationUnit
clang_parseTranslationUnit(CXIndex CIdx,
                        const char *source_filename,
                        const char *const *command_line_args,
                        int num_command_line_args,
                        struct CXUnsavedFile *unsaved_files,
                        unsigned num_unsaved_files,
                        unsigned options) {
CXTranslationUnit TU;
enum CXErrorCode Result = clang_parseTranslationUnit2(
    CIdx, source_filename, command_line_args, num_command_line_args,
    unsaved_files, num_unsaved_files, options, &TU);

如果我发现任何更实质性的内容,我会更新这个答案。鉴于这种可调试性差距,直接从 C++ 进行 libclang 分析可能会更有效,如下所示fella http://bastian.rieck.me/blog/posts/2016/baby_steps_libclang_function_extents/执行此操作,或者使用命令行工具clang-query喜欢详细的here https://devblogs.microsoft.com/cppblog/exploring-clang-tooling-part-2-examining-the-clang-ast-with-clang-query/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 上的 python libclang 绑定无法从 Sublime Text 初始化翻译单元 的相关文章

  • 当变量取特定值时如何使 PyCharm 中断?

    我有一本大字典 其中一些元素偶尔会出现非法值 我想弄清楚非法值从何而来 PyCharm 应该不断监视我的字典的值 一旦它们中的任何一个取了非法值 它就应该中断并让我检查程序的状态 我知道我可以通过为我的字典创建一个 getter sette
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐