如何验证virtualenv的完整性

时间:2018-10-10 07:13:00

标签: python virtualenv

我正在寻找一种在运行时验证virtualenv完整性的方法。

明确一点;我们正在将python项目部署到生产服务器。在部署下,将创建一个virtualenv并使用pip和setuptools安装软件包(因为我们自己的软件包未分发)。到目前为止,一切都井井有条。这是医学级应用程序,因此在每次运行时,我们都需要验证virtualenv是否已被更改。根据pip列表(或者如果我们切换到pipenv,则为pipfile.lock)检查版本是不够的(据我所知)。我们还需要验证virtualenv中没有任何更改(例如,virtualenv / lib / python / site-packages下代码的更改)。有pythonic的方法可以做到这一点吗?

1 个答案:

答案 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中的每个文件都将完成此操作。

不确定这对您来说是否可行,但是这样做很有趣,因此感谢您的提问:)