Python中如何使用compileall模块排除指定子目录?

下面的命令,可以使用 python compileall,并且排除一个子目录。
python -m compileall -x r"/folder1" /python-folder/

请问,如何排除 2 个子目录呢?谢谢。
Python中如何使用compileall模块排除指定子目录?

10 回复

自己写 compile 脚本包装下


在Python的compileall模块中,compile_dir函数可以通过rx参数来排除特定目录。rx是一个正则表达式对象,匹配到的目录路径会被跳过。

这里是一个直接可用的例子:

import compileall
import re

# 要编译的根目录
root_dir = '/path/to/your/project'

# 创建正则表达式,排除名为 'exclude_this' 和 'tests' 的子目录
# 注意:模式需要匹配完整的目录路径片段
exclude_pattern = re.compile(r'/exclude_this/|/tests/')

# 递归编译,排除匹配的目录
compileall.compile_dir(root_dir, rx=exclude_pattern, force=True, quiet=1)

关键点解释:

  1. rx=exclude_pattern:这是核心。compile_dir会遍历目录,并将每个目录的完整路径与这个正则表达式进行匹配。如果匹配成功,整个目录及其子目录都会被跳过。
  2. 正则表达式模式r'/exclude_this/|/tests/'。这里使用了两个关键部分:
    • /exclude_this//tests/:匹配路径中包含这些字符串的目录。路径分隔符 (/) 很重要,它确保了只匹配目录名,而不是文件名中包含这些词。
    • |:表示“或”的逻辑,用于排除多个目录。
  3. 其他常用参数
    • force=True:强制重新编译,即使 .pyc 文件已存在且是最新的。
    • quiet=1:只打印错误信息,减少输出噪音。
    • maxlevels=0:可以限制递归深度,0 表示无限制。

如果你想排除的目录就在根目录下,也可以这样写,更直观:

exclude_pattern = re.compile(r'[/\\](exclude_this|tests)[/\\]')

这个模式匹配路径分隔符 (/\) 后紧跟 exclude_thistests,然后再跟一个路径分隔符,能更准确地定位到目录节点。

一句话总结:用 rx 参数配正则表达式来精准排除目录。

find,grep,xargs

可以借用 compileall -x (regex)的吧?只是这个 regex 稍复杂点。

使用 compileall -x (regex) 应该是最简洁的吧?只是这个 regex 稍复杂点。

使用 compileall -x (regex) 应该是最简洁的吧?只是这个 regex 稍复杂点。

看来大家都是混淆成 pyc 啊 手动滑稽

是啊,compileall 就是 byte-comile => .pyc 文件的。

有 2 个子目录,我想排除掉( skipped )。如果只是 skip 一个子目录 -x r"/folder1" 工作得非常好,但是我不知道怎么写这个 regex 来排除 2 个 或 3 个 子目录。

回到顶部