使用pygments计算源代码行(sloc)

pygount的Python项目详细描述


脓肿

pygount是一个命令行工具,用于扫描文件夹中的源代码文件和 计算其中的源代码行数。它类似于 sloccount cloc 但使用 pygments 包来分析源代码,因此可以分析任何 pygments支持的编程语言

名称是pygments和count的组合。

pygount是开源的,并在 BSD许可证 。来源 代码可从https://github.com/roskakori/pygount" rel="nofollow">https://github.com/roskakori/pygount

下载并安装

pygount可从 https://pypi.python.org/pypi/pygount 获得,可以是 已安装运行:

$ pip install pygount

用法

只需运行并指定要递归分析的文件夹,例如:

$ pygount ~/development/sometool

如果省略了该文件夹,则shell的当前文件夹将用作启动 点。除了文件夹,您还可以指定单个文件和shell模式 (使用< TT>), * 和范围,如 [a-z] )。

某些文件和文件夹将自动排除在分析之外:

  • 以点(.)开头或以tilda(~)结尾的文件
  • 以点(.)开头或命名的文件夹

要指定替代模式,请使用 --文件夹跳过 --要跳过的名称。两者都采用逗号分隔的模式列表,如下所示 关于模式语法。例如,还阻止以两个开头的文件夹 从正在分析的下划线( \u )中,指定 --要跳过的文件夹=[…],

要限制对某些文件类型的分析,可以指定逗号分隔 要考虑的后缀列表,例如

默认情况下,分析结果写入 格式类似于sloccount。要将输出重定向到文件,请使用例如 --out=counts.txt 。要将格式更改为类似于cloc的xml文件,请使用 --格式=CLOC XML

模式

有些命令行参数将模式作为值。

默认情况下,模式是使用 * 的shell模式。 范围如下 作为占位符。根据您的平台,是区分大小写的 (Unix)或不(Mac OS、Windows)。

如果模式以 [regex] 开头,则可以指定逗号分隔的列表 而是使用 python正则表达式语法 。 正则表达式区分大小写,除非它们包含 (?i) 标志。

如果第一个实际模式是 […] 则包括默认模式。 如果没有它,默认值将被忽略,只有明确声明的模式 考虑在内。

例如,指定生成的代码也可以包含德语单词 "generiert"在一个不敏感的情况下使用 --生成的=[regex][…](?i.。*generiert

源代码编码

当读取源代码时,pygount会自动检测编码。它使用 一个简单的算法,它可以识别bom、xml声明,例如:

<?xml encoding='cp1252'?>

以及"神奇"的评论,如:

# -*- coding: cp1252 -*-

如果文件没有合适的标题,pygount将尝试读取它 使用UTF-8。如果失败,它将使用回退编码(通过 并忽略任何编码错误。

您可以使用 --编码选项来更改此行为:

  • 要保持自动分析并使用不同的回退编码,请指定 例如:编码=自动;ISO-8859-15
  • 要使用基于启发式的自动检测,请使用 --encoding=chardet 。为了让它起作用, 必须安装chardet 包,
  • 要使用特定的编码(对于分析的所有文件),请使用 --编码=ISO-8859-15

伪语言

如果不计算源代码,则行数为0,语言为 显示的是一个伪语言,表示原因:

  • _二进制文件-源代码是二进制文件;二进制文件的检测 首先确保文件不以utf-8、utf-16或 utf-32(表示文本文件)。之后它检查零字节 在文件的初始8192字节内。
  • _重复-源代码是另一个 文件;启用命令行选项 --重复项 复制(并获得较小的性能改进)
  • _空的-源代码是一个0字节大小的空文件。
  • _错误-无法分析源代码,例如,由于I/O错误。
  • _生成-源代码根据命令行生成 选项 --生成的
  • _未知的pygments不提供解析源代码的lexer。

其他信息

要获取所有可用命令行选项的说明,请运行:

$ pygount --help

要获取版本号,请运行:

$ pygount --version

持续集成

pygount可以生成输出,这些输出可以由 sloccount插件 对于持续集成服务器。

建议在构建的第一步中运行pygount 在任何不需要的文件(如编译器目标或生成的源)之前处理 代码已生成。

jenkins的"execute shell"构建步骤示例如下:

pygount --format=cloc-xml --out cloc.xml --suffix=py --verbose

然后添加生成后操作"发布sloccount分析结果"并设置 "sloccount report"到"cloc.xml"。

pygount如何计算代码pygount基本上计算源代码的物理行数。

首先,它使用分配给它的lexers pygments 来解析代码。如果 pygments 找不到合适的lexer,pygount还有一些额外的 至少可以区分代码和注释的内部词汇表:

  • m4、vbscript和webfocus使用了能够区分 介于注释和代码之间。
  • omg idl重新调整现有java lexer的用途。

此外,纯文本还有一个单独的lexer,它将所有行都计算为注释。

仅包含注释标记和空白的行将计为注释。 只包含空格的行不被考虑在内。一切 否则算作代码。

如果一行只包含"白色字符",则不考虑 可能是因为代码的格式只是为了使 读。当前白色字符为:

(),:;[]{}

因此,pygount报告说,对于c-like,sloc减少了10%到20% 与其他类似工具相比的语言。

对于某些语言,检测不到"任何操作"并将其视为空白。 例如python的 pass 或transact-sql的 begin end

例如,请考虑以下python代码:

class SomeError(Exception):
    """
    Some error caused by some issue.
    """
    pass

这包括1行代码和3行注释。带 通过的行 被视为"无操作",因此不予考虑。

与其他工具比较

pygount可以分析比其他常用工具(如sloccount)更多的语言 或者cloc,因为它构建在 pygments 之上,后者提供数百个lexer 关于语言。这也使得支持另一种语言变得容易:简单地 编写自己的lexer

对于某些角落的情况,脓肿会给出更准确的结果,因为 实际上,与其他主要查找注释的工具不同,它会对代码进行词法分析 标记,当它们出现在字符串中时可能会混淆。在实践中 不过,这应该没什么区别。

pygount比大多数其他工具都慢。部分原因是 而不是扫描代码。部分其他工具可以使用 静态编译语言,如java或c,通常速度更快 而不是动态语言。对于许多应用,尽管pygount应该 "足够快",尤其是在夜间构建时调用。

API

pygount提供了一个简单的api来将其集成到其他工具中。然而,这是 目前仍在进行中,可能会有更改。

下面是一个关于如何分析pygount自己的源代码的示例:

$ pip install pygount
0

版本历史记录

版本1.0.0,2017-07-04

  • 修正了sax解析器导致的xml文件 <;unknown>; 的混淆警告。 作为解决方法, <;unknown>; 现在被 无法分析的XML文件。
  • 将Python3.6添加到受支持版本列表中(问题 14 )。

版本0.92017-05-04

  • 修正了在指定选项时断言错误的问题。
  • 已更改警告消息"未指定回退编码,使用<;编码>;" 因为它没有添加任何有趣的信息 实际使用的编码在每个文件的信息消息中都可见。
  • 添加了对二进制文件的检测并将其排除在分析之外。在 特定的django模型对象( *.mo )不被视为modelica 源代码不再(问题 11 )。
  • 通过dtd增加了docbook xml的检测(问题 10 )。
  • 添加了对足以根据 有关文件扩展名的Oracle常见问题解答条目 (问题 12 )。
  • 添加了为编码"chardet"指定回退编码的可能性。使用 例如, --encoding=chardet;cp1252

版本0.8,2016-10-07

  • 固定选项。现在每个分析过的源代码至少 日志中有一条信息性消息。
  • 添加了使用大小和MD5代码作为标准检测重复项(问题 2 )。使用选项 --重复 以仍然计算重复源代码。
  • 改进了对编程语言的厌恶,它现在更加一致 在python调用之间产生相同的语言。

版本0.7,2016-09-28

  • 修正了忽略生成的选项。
  • 添加了对 pygments不支持的两种语言的支持:
    • m4、vbscript和webfocus使用了能够区分 介于注释和代码之间。
    • omg idl重新调整现有java lexer的用途。
  • 将某些XML方言作为独立语言添加检测(问题 8 )。

版本0.6,2016-09-26

  • 修正了如果第一个非ascii 字符只出现在16千字节之后,编码不是utf-8。 现在pygount试图在假设之前将整个文件读取为utf-8 实际上是utf-8。
  • 将纯文本文件中的行更改为注释(问题 9 )。在pygments之前 将它们视为resourcebundle
  • 已更改空文件已将空文件作为语言(问题 7 )。
  • 扩展工作区 pygments问题1284 * 替换任何雷克萨斯 *+Evoque

版本0.5,2016-09-22

  • 添加了生成的源代码被排除在分析之外(问题 1 )。使用选项 --生成 以指定指示生成代码的模式。
  • 为pygments添加了解决方案,有时会检测到与xml相同的xml文件 以及其他时候的xml+evoque(可能取决于散列种子)。现在 XML+Evoque始终更改为XML。
  • 添加了默认的 --跳过的文件夹
  • 为无法分析的源代码添加了伪语言注释。

版本0.4,2016-09-11

  • 修正了在magic comment中出现的编码错误(问题 4 )。
  • 添加了选项 --要跳过的文件夹和 --要跳过的名称 文件应排除在分析之外。
  • 在"白色字符"列表中添加逗号( )和冒号( )。 如果行中没有其他内容,则不算作代码。
  • 改进的模式匹配:根据 --help的所有选项 采用 模式 表达式而不是shell模式(使用 [regex] )并且 应该扩展默认模式(使用 […] )。
  • 改进的文档:添加了关于如何计算代码以及pygount的注释 与其他类似工具进行比较。

版本0.3,2016-08-20

  • 修正了dos批处理文件中的注释(问题 3 )。
  • 已清除代码。

版本0.22016-07-10

  • 修复了以下划线开头的文件(例如 \uu init\uuu.py )是 排除在分析之外。
  • 已将chardet包更改为可选包。
  • 增加了指定要分析的单个文件和全局模式的可能性。
  • 添加了只包含某些字符的行被视为白色 用空格代替代码。目前这涉及方括号( ([]{} )和 分号( )。
  • 添加了python的 pass 语句被视为空白而不是 代码
  • 清理并(稍微)优化了代码。

版本0.1,2016-07-05

  • 首次公开发行。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java OnClick用于ListView中的特定项   java如何多次循环相同的TestNG测试。包括课前和课后   java如何在Codenameone中设置BrowserComponent浏览器窗口大小   java Socketchannel始终为空   java以编程方式向JavaFX WebEngine历史添加新条目   java Hibernate+Spring与Oracle一起使用分层查询(从+连接方式开始)   Java中的安卓 getView和Beacon(Estimote)问题   计时器如何在java中设置暂停选项   java为什么输入1000000000000的输出不正确?   java如何在程序执行期间更改log4j2中的日志记录级别   java阻止代码引发XML异常   未找到媒体类型为application/json的java JAX RS MessageBodyWriter   java如何将BuffereImage中的特定颜色(0xFF00FF)设置为透明?   java如何列出web元素,如果网页中没有特定链接的id,如何单击网页中的特定链接?   在Java中读取txt文件时获取EOFEException   java如何避免为每个视图添加inject方法?   JavaSpringController:Facebook上类似文章的永久链接   java在尝试执行脚本时遇到错误“net.serentiybdd.core.exceptions.serentitymanagedexception:No session ID”