Tengo un gran sistema escrito en python. cuando lo ejecuto, lee todo tipo de datos de muchos archivos diferentes en mi sistema de archivos. Hay miles de líneas de código y cientos de archivos, la mayoría de ellos en realidad no se utilizan. Quiero ver a qué archivos accede realmente el sistema (ubuntu) y, con suerte, en qué parte del código se abren. Los nombres de archivo se deciden dinámicamente usando variables, etc., por lo que los nombres de archivo reales no se pueden determinar simplemente mirando el código. Tengo acceso al código, por supuesto, y puedo cambiarlo.
Trato de averiguar cómo hacer esto de manera eficiente, con cambios mínimos en el código:
Gracias
Puede rastrear accesos a archivos sin modificar su código, usando strace. O comienzas tu programa con strace, así
strace -f -e trace=file your_program.pyDe lo contrario, adjunta strace a un programa en ejecución como este
strace -f -e trace=file -p <PID>Para 1 - Puedes usar
ls -la /proc/<PID>/fd` Reemplazando <PID> con su ID de proceso. Tenga en cuenta que le dará todos los descriptores de archivos abiertos, algunos de ellos son stdin stdout stderr y, a menudo, otras cosas, como open websockets (que usan un descriptor de archivo), sin embargo, filtrarlo por archivos debería ser fácil.
Para 2: vea la excelente solución propuesta aquí: anule la función de apertura de python cuando se usa con la palabra clave 'as' para imprimir cualquier cosa
por ejemplo, reemplazando la función abierta con la suya propia, lo que podría incluir el registro adicional.
Un método posible es "sobrecargar" la función open . Esto tendrá muchos efectos que dependen del código, así que lo haría con mucho cuidado si fuera necesario, pero básicamente aquí hay un ejemplo:
>>> _open = open >>> def open(filename): ... print(filename) ... return _open(filename) ... >>> open('somefile.txt') somefile.txt Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in open FileNotFoundError: [Errno 2] No such file or directory: 'somefile.txt' Como puede ver, mi nueva función open devolverá la open original (renombrada como _open ), pero primero imprimirá el argumento (el nombre del archivo). Esto se puede hacer con más sofisticación para registrar el nombre del archivo si es necesario, pero lo más importante es que debe ejecutarse antes de cualquier uso de open en su código.