使用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 ~/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 pygount0
版本历史记录
版本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
- 首次公开发行。