检测命令是否修改了 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
上使用 ==
会自动检查所有键是否相等(即,如果文件被添加或删除),以及所有相应的修改时间值是否相等。
可以想象,如果另一个进程访问该文件夹,您会以这种方式得到一些误报,但实际上不可能得到误报,除非有人明确地弄乱了修改时间。
我有一个 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
上使用 ==
会自动检查所有键是否相等(即,如果文件被添加或删除),以及所有相应的修改时间值是否相等。
可以想象,如果另一个进程访问该文件夹,您会以这种方式得到一些误报,但实际上不可能得到误报,除非有人明确地弄乱了修改时间。