检测命令是否修改了 Python 脚本中目录中的任何文件

Detect if a command modifies any files from a directory within a Python script

我有一个 Python 脚本:

import subprocess

subprocess.run(['black', 'src'])

我想知道 subprocess 的命令 运行 是否修改了文件夹 src 中的任何文件 - 所以,我希望我的脚本如下所示:

import subprocess

subprocess.run(['black', 'src'])
mutated = <???>

如何检测目录 src 中的任何文件在 subprocess.run 命令后是否发生变化,如果发生变化,则将 True 分配给 mutated

编辑

使用 os.path.getmtime 对我不起作用:

(Pdb) os.path.getmtime(str(arg))
1596263725.3222768
(Pdb) subprocess.run(['black', str(arg), '--line-length=5'])
reformatted /tmp/tmp7e7suv4e/tests/data/clean_notebook   .py
reformatted /tmp/tmp7e7suv4e/tests/data/notebook_for_testing   .py
reformatted /tmp/tmp7e7suv4e/tests/data/notebook_for_testing_copy   .py
reformatted /tmp/tmp7e7suv4e/tests/data/notebook_starting_with_md   .py
All done! ✨  ✨
4 files reformatted, 2 files left unchanged.
CompletedProcess(args=['black', '/tmp/tmp7e7suv4e/tests', '--line-length=5'], returncode=0)
(Pdb) os.path.getmtime(str(arg))
1596263725.3222768

不是最可靠的方法,但您可以在 运行 子进程之前立即获取系统时间,然后将其与文件夹的 modification time 进行比较。

from time import time
from os.path import getmtime

before = time()
# Run subprocess
mutated = getmtime('src') > before

这种方法有点不可靠,例如,如果您的系统时钟在两次重启之间被重置或其他什么。更好的方法是比较文件夹的修改时间:

from os.path import getmtime

before = getmtime('src')
# Run subprocess
mutated = getmtime('src') != before

这是可行的,因为在普通文件系统上,“修改”文件通常涉及重写它,这意味着更新它的目录条目,这反过来意味着修改目录本身。 touch 是一个不这样做的程序示例。如果你 运行 进入一个不这样做的程序,你总是可以用同样的方式检查文件夹中各个文件的修改时间:

from os import listdir
from os.path import join, getmtime

def mtimes(path):
    return {fname: getmtime(join(path, fname)) for fname in os.listdir(path)}

before = mtimes('src')
# Run subprocess
mutated = mtimes('src') == before

dict 上使用 == 会自动检查所有键是否相等(即,如果文件被添加或删除),以及所有相应的修改时间值是否相等。

可以想象,如果另一个进程访问该文件夹,您会以这种方式得到一些误报,但实际上不可能得到误报,除非有人明确地弄乱了修改时间。