- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
简短说明:使用 libclang
自动完成代码不适用于与 Sublime Text 3 捆绑在一起的 python。
详细信息:Github 上的存储库中有一个可验证的小示例
本质上,有一个脚本使用略有改动的 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.
这是因为 cindex.py
中 libclang 返回的翻译单元的 ptr 是 None
。对我来说唯一奇怪的是它只发生在与 sublime text 3 捆绑在一起的 python 中。
其他人也会这样吗?有谁知道可能是什么原因或如何调试它?
如果您无法运行此处提供的示例,也可以随时 ping 我。
UPD:在测试项目的问题中,我们发现 sublime text 中捆绑的不是 ctypes。将 sublime text 中的替换为系统中安装的会产生相同的错误。
UPD2:我已经精简了测试存储库中的 cindex.py
文件,只包含遇到相同问题所需的最少代码在问题中描述。也许这将有助于产生关于可能出错的新想法?此外,我想明确指出,相同的代码在 Linux 和 OSX 上的工作方式完全符合预期。
最佳答案
事实证明,此故障的可调试性很差。我追踪了一堆 libclang 绑定(bind)源,希望找到一种解决方法,以解决围绕从 python 抛出的 TranslationUnitLoadError
缺乏可调试性的问题。
即使您使用 ctypes errcheck
callback,这里似乎也存在一些基本限制。像下面...
# 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几年前添加了关于 libclang 的 clang_parseTranslationUnit
固有的可调试性差距。
# FIXME: Make libclang expose additional error information in this scenario.
关于这篇文章 Dealing with parse errors with Python bindings of libclang 进行了一些讨论.最好的建议似乎来自将调试器附加到 libclang 的想法:
...you might be able to get a debugger to break on
clang_parseTranslationUnit
and inspect the error state there.
要深入了解一些内部结构,基本上 libclang 是通过 ctypes call 加载到 python 中的。到 cdll.LoadLibrary
创建一个 CDLL实例。然后,在 functionList
中定义为一组元组的一组硬编码函数全部通过 register_functions
注册,以赋予它们更深的 python 存在。实际的 TranslationUnitLoadError
得到 raised在类方法 TranslationUnit.from_source
中直接调用行中的 libclang 函数
ptr = conf.lib.clang_createTranslationUnit(index, fspath(filename))
我相信这是可调试性被截断的地方,因为底层 source因为 python 绑定(bind)是 C,而不是 C++,所以没有像 SEHException 这样冒泡的异常处理。对于 .net 会。使用该运行时,您可以调试非托管代码。然而这里没有等价物。
您可以从其 source 的调用堆栈向下追踪翻译单元变量 TU
...
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可以,或者使用命令行工具 clang-query
详细说明 here
关于Windows 上的 python libclang 绑定(bind)无法从 sublime text 初始化翻译单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37774599/
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[text(text - text text) !text]。这里的文本实际上可以是任何字符。并且间距很重要。文本将如图所示列出。 我已经
这个问题在这里已经有了答案: Remove duplicate commas and extra commas at start/end with RegExp in Javascript, and
我有以下代码。 from xml.dom.minidom import Document doc = Document() root = doc.createElement('root') doc.a
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Find text string in jQuery and make it bold 如何使用 jQuer
我使用 libmagic 在我的元素的 Web 界面中获取文件的 MIME 类型。我在 css 和 js 文件上得到文本/纯 mime 类型。 例如 chromium 显示以下警告: Resource
起初我必须阅读很多教程,但我仍然不知道我做错了什么...... 我想内联使用 4 个 div。在我想放置的那些 div 中:文本、图像、文本、文本。我希望中间文本自动设置为最大宽度。 我写了一个简单的
我想替换所有出现的 [b: "text"]至text使用 JavaScript 和 RegEx。目前我知道如何替换 [b: ""]至使用'/\[b: ""\]/g'但我不知道如果 " 之间有文本该怎么
这可能是一个幼稚的问题,但我想知道是否有比使用 text() 更好的方法将文本添加到绘图中。注意,我也在使用 layout()以及。具体来说,我有一个情节的一部分,我想在其中添加一些带有标题的文本,然
我必须反复从 latex 源粘贴代码,因此每次都必须做很多查找和替换操作('“a'=>'ä','” o'=>'ö',...) 。 有没有一种方法可以存储这些搜索和替换规则,例如,我可以通过一次按键执行
当我在Sublime Text 3代码屏幕中编写代码时,它连续地向右滑动,如图所示。我该怎么办? 请注意第10行。 最佳答案 如果您只想为当前 View (正在编辑的当前文件)激活自动换行,只需vie
是否有可能更改 sublime text 中的默认字体目录?我只想使用可移植 sublime 文本存储在我的 pendrive 上的字体,这样我就不必在我使用可移植 sublime 文本的每台机器上安
我是 Android 开发的新手,我有一个愚蠢的问题。如何将“文本字段”框放在一行中的文本旁边。 例子: Please Enter the number: [ ] 关于 "t
我想自动将“我的文本”更改为“我的文本”,因为这是用德语写的正确方式。引号可以在文本中的任何位置。 有没有一种简单的方法可以实现这一点? 解决方案应该检查第一个字符,最后一个字符,比如“this”,或
我想知道是否有特殊的语法来绑定(bind)与现有文本连接的文本。 像这样。 显然,这行不通。 什么是最佳实践? 使用 SL4。 最佳答案 使用StringFormat在 Binding 上。 WPF
我认为它应该打印“真实文本”,因为它相当于 true console.log('true text' || true ? 'text' : 'text1'); 但是,输出是“文本”;抱歉,如果是愚蠢的
有没有办法通过 css 打破文本,以便中间有一个“空白”?目前我正在通过手工打破文本来解决这个问题 -但这是愚蠢的。我知道有一个函数可以让文本在另一个 div 中结束和开始,但 IE 不支持它。 文本
我想为我的Tcl/Tk工具实现一个效果:在text控件中,根据具体情况,希望高亮一些线条的背景色,其他线条正常透明.有可能吗? 我尝试了一些选项,例如:-highlightbackground 、-i
我正在尝试解析原始维基百科文章内容,例如the article on Sweden ,使用re.sub()。但是,我在尝试替换 {{some text}} block 时遇到了问题,因为它们可以包含更
我试图先删除 ComboBox 中的所有内容。然后在其前面添加文本,但保留了一些旧文本。有没有办法重置或清除 ComboBox?或者我怎样才能最好地实现这一目标? public void GetBad
我知道我们应该创建 Example对象并将其传递给 nlp.update() 方法。根据 docs 中的示例, 我们有 for raw_text, entity_offsets in train_da
我是一名优秀的程序员,十分优秀!