我正在寻找一种在运行时验证virtualenv完整性的方法。
明确一点;我们正在将python项目部署到生产服务器。在部署下,将创建一个virtualenv并使用pip和setuptools安装软件包(因为我们自己的软件包未分发)。到目前为止,一切都井井有条。这是医学级应用程序,因此在每次运行时,我们都需要验证virtualenv是否已被更改。根据pip列表(或者如果我们切换到pipenv,则为pipfile.lock)检查版本是不够的(据我所知)。我们还需要验证virtualenv中没有任何更改(例如,virtualenv / lib / python / site-packages下代码的更改)。有pythonic的方法可以做到这一点吗?
答案 0 :(得分:2)
我认为这可以做到:
import hashlib, os
basedir = os.path.abspath(os.path.dirname(__file__))
hasher = hashlib.md5()
directory = "/".join((basedir,"venv"))
bs=4096
def flatten(d):
for path, dirs, filenames in os.walk(d):
for filename in filenames:
yield os.path.join(path, filename)
if os.path.exists(directory):
dircontent = list(flatten(directory))
for item in dircontent:
with open(item, "rb") as _f:
buf = _f.read(bs)
while len(buf) > 0:
hasher.update(buf)
buf = _f.read(bs)
else:
exit(1)
print(hasher.hexdigest())
flatten
函数非常简单,它仅遍历venv并创建一个巨大的列表,其中列出了从文件树的顶部到底部的所有文件路径,从您以d
提供的任何路径开始-参数。我从here
然后我以ro,b模式打开文件,并将小块读取到缓冲区中(以防万一出现大文件时不阻塞系统内存),并使用缓冲区内容更新md5-hashobject。 venv中的每个文件都将完成此操作。
不确定这对您来说是否可行,但是这样做很有趣,因此感谢您的提问:)