【问题标题】:Pydev source file hyperlinks in Eclipse consoleEclipse 控制台中的 Pydev 源文件超链接
【发布时间】:2017-07-16 09:16:57
【问题描述】:

当 Python 应用程序崩溃时,控制台会显示指向发生异常的源代码的超链接。您只需单击该链接,您的源文件就会在 Eclipse 编辑器中打开。

我有自己的异常处理程序,并希望在我的应用程序崩溃时将指向源文件的链接放在控制台中。

我已经找了几次这方面的信息,但不知道该怎么做,或者根本不知道。

似乎可以通过以':'形式写入控制台来在java中完成 - 侦听器将其拾取并将其转换为可点击的链接。这在 Python 中不起作用。

有什么想法吗?

【问题讨论】:

    标签: python eclipse debugging console pydev


    【解决方案1】:

    如果您想在 PyDev 中设置可点击的链接,您必须以与 Python 中相同的方式进行操作。

    即:您可以从https://github.com/fabioz/Pydev/blob/master/plugins/org.python.pydev.debug/src/org/python/pydev/debug/ui/PythonConsoleLineTracker.java 看到它匹配的模式是:

    .*(File) \\\"([^\\\"]*)\\\", line (\\d*).

    (注意\是java上字符串中的转义)。

    【讨论】:

    • 只适用于像我这样必须盯着正则表达式一段时间才能弄清楚的人。 '文件“”,行'
    • 我刚刚查看了代码,如果正则表达式 File "%(pathname)s", line %(lineno)s 不匹配,则有一条路径尝试解析 %(pathname)s:%(lineno)s,但我发现它只有在它出现时才有效在行首;将%(pathname)s:%(lineno)s 放在另一个字段(例如时间戳)之后是行不通的。
    【解决方案2】:
    import logging, sys, os
    logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
    log = logging.getLogger(os.path.basename(__file__))
    
    log.debug("hello logging linked to source")
    

    以上就是你所需要的,下面是更多扩展的讨论,包括使用配置文件进行格式化和 getLogger 的包装器。

    2017 年 11 月 19 日添加了两个额外的正则表达式,因此日志配置中的日志格式化程序只需要包含 '%(filename)s:%(lineno)s' 即可创建更简洁的链接。 示例:

    [formatter_customFormatter] format=%(asctime)s | %(name)s | %(levelname)s | %(message)s '%(filename)s:%(lineno)s'

    然而,当从子目录调用导入的代码时,这会失败,因为文件名不包含任何路径信息。使用%(filepath)s 可以工作,但是以打印附加到日志输出的整个绝对路径为代价,之前的文件正则表达式遇到了同样的问题。但是%(name)s 通常几乎完全符合您的要求,即 parent_dir.filename,因为通常的做法是将__name__ 传递给 getLogger 调用。怎么办?

    logging.getLogger(__name__.replace(".","/") + ".py")

    您还可以使用与中相同的代码围绕 getLogger 编写一个包装器

    def getLogger(name): return logging.getLogger(name.replace(".","/") + ".py")

    然后您对 Logger 的调用就正常了

    logger = myLogger.getLogger(__name__).

    需要注意的是,__name__ 是运行 main 的 '__main__',因此您需要区别对待才能从文件中获取链接。一种简单的方法是将 my_filename_with_main 而不是 __name__ 传递给 getLogger。

    或者可能对所有内容使用不同的包装器,如

    def getLogger(name): from os import path name = path.basename(name) return logging.getLogger(name)

    然后您对 Logger 的呼叫将是

    logger = myLogger.getLogger(__file__).

    然后在文件运行为'__main__'的情况下没有特殊处理
    这是一个格式示例,名称是传递给 getLogger 的任何内容:
    format=%(asctime)s | %(levelname)s | %(name)-20s | %(funcName)-10s | %(message)-35s | '%(name)s:%(lineno)s'

    Fabio 提供的链接,2017 年 3 月非常有用,我会在这里重复一遍,https://github.com/fabioz/Pydev/blob/master/plugins/org.python.pydev.debug/src/org/python/pydev/debug/ui/PythonConsoleLineTracker.java 第 102 - 104 行,可以找到正则表达式。

    注意:PyCharm 只喜欢单引号版本(如上所示),Eclipse 不是那么特别,两者都有效。

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 2015-05-31
      • 2021-04-27
      • 2011-10-08
      • 2010-10-10
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多