Python遥测记录加载的所有Python模块

2024-09-28 21:12:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用venv和pip创建一个友好的python开发环境,这样用户就可以在PYTHONPATH上启动一个包含所有LIB的jupyter笔记本。 为了删除用户不使用的lib,我想将Python执行期间加载的所有lib记录在一个集中的NAS共享中(它们在主机上运行Python进程,但可以在一个中央NAS共享中写入)。为此,我考虑使用strace -e trace=open,read python..并根据我的libs文件路径过滤条目,但我非常确定应该有一个标准的python库来完成这种遥测工作


Tags: pip用户环境venv进程lib记录trace
2条回答

您可以包装builtins.__input__以记录导入模块的名称,然后运行(通过exec函数,但我们需要捕获if __name__ == '__main__':块,因此这可能是不可避免的)要监视的代码:

loggy.py

#!/usr/bin/env python3

import builtins
import sys

if __name__ == '__main__':

    builtins.__import_copy__ = builtins.__import__

    __libs = set()

    def __import_wrap__(*args,**kwargs):
        __libs.add(args[0])
        return builtins.__import_copy__(*args,**kwargs)

    builtins.__import__ = __import_wrap__

    sys.argv = sys.argv[1:]

    exec(open(sys.argv[0]).read())

    print(__libs)

测试脚本test.py

#!/usr/bin/env python3

import re
import sys

if __name__ == '__main__':
    x = re.findall(r'all\w*',sys.argv[1])
    print(x)

对我(Python 3.6.9)来说,这似乎可以记录辅助脚本导入的所有模块:

mostly@ubuntu:~$ python3 loggy.py test.py "allways misspelling"
['allways']
{'_heapq', 'functools', 'collections.abc', 'operator', 'weakref', 'sys', 'copyreg', '_weakref', 'itertools', '_locale', 'abc', '_collections', 'sre_compile', 'enum', 'sre_parse', '_operator', '_collections_abc', '_bootlocale', '_sre', 'sre_constants', '_thread', 'heapq', 'reprlib', 'keyword', '_functools', 're', 'collections', '_weakrefset', 'builtins', 'types'}

问题

监视用户python环境/工作站上的python进程,以确定要删除哪些未使用的LIB

解决方案

我不确定是否有现成的独立工具strace(正如你在问题中提到的那样)+syslog是一个选项。我知道您提到过将日志保存到NAS,但我也会考虑使用轻量级^ {< CD2> }服务器,如^ {< CD2> },可以处理边缘情况(即:自动重试),并提供一个接口,以便您能够过滤日志。p>

参考资料

系统日志筛选器引用:https://www.syslog-ng.com/technical-documents/doc/syslog-ng-open-source-edition/3.17/administration-guide/52#TOPIC-989744

相关问题 更多 >