使用Python子进程跟踪executab创建的文件

2024-06-26 18:06:37 发布

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

我不熟悉python和redhatlinux。我正在使用subprocess模块执行另一个创建文件的C程序。我能够从C程序中捕获退出代码。但是我有没有办法让python跟踪并显示C程序创建的文件名?在

注意:我不能修改C程序。C程序创建带有时间戳的输出文件,并且它的许多实例可以并行运行。我只想捕获由python运行的实例创建的文件。 如果不是子流程模块,是否还有其他方法可以做到这一点?在


Tags: 模块文件实例方法代码程序文件名时间
1条回答
网友
1楼 · 发布于 2024-06-26 18:06:37

是的,前提是你能得到C程序的进程ID。您可以使用从subprocess.Popen返回的对象的pid属性来执行此操作。在

获得pid之后,您可以打开/proc文件系统中的进程条目,并查看fd子目录。它包含指向进程已打开的所有文件的符号链接。可以通过这些链接获得真正的文件名。在

例如,这将返回文件名列表:

import re
import os

def get_filenames(pid):

    dir = '/proc/' + str(pid) + '/fd'
    if not os.access(dir, os.R_OK|os.X_OK): return
    filenames = []

    for fds in os.listdir(dir):
        for fd in fds:
            full_name = os.path.join(dir, fd)
            try:
                 filename = os.readlink(full_name)
                 if filename == '/dev/null' or \
                   re.match(r'pipe:\[\d+\]',file) or \
                   re.match(r'socket:\[\d+\]',file):
                      filename = None
            except OSError as err:
                if err.errno == 2:     
                    filename = None
                else:
                    raise(err)

            if filename:
                filenames.append(filename)  

    return filenames

或者,下载psutilhttps://pypi.python.org/pypi/psutil,并使用get_open_files()方法。在

请注意,无论使用哪种机制,都有可能出现争用条件,因为通常您不知道C程序何时打开或关闭文件。在

相关问题 更多 >