2015-04-16 4 views
0

Я новичок в python и Redhat linux. Я использую модуль subprocess для выполнения другой программы на C, которая создает файл. Я могу захватить код выхода из программы C. Но есть ли способ, которым я могу сделать дорожку python и отображать имя файла, созданного программой C?Использование подпроцесса Python для отслеживания файлов, созданных исполняемым файлом

Примечание: я не могу изменить программу C. Программа C создает выходные файлы с отметками времени, и многие экземпляры могут работать параллельно. Я хочу только захватить файлы, созданные экземпляром, запущенным python. Есть ли другой способ сделать это, если не модуль подпроцесса?

ответ

1

Да, при условии, что вы можете получить идентификатор процесса программы C. Вы можете сделать это с помощью атрибута pid объекта, возвращаемого с subprocess.Popen.

Получив 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 открывает или закрывает файл.

+0

Спасибо за ответ. Однако os.listdir не может найти каталог, соответствующий fid. Это потому, что программа c может закрыть файл до того, как скрипт python сможет его найти? – user1802785

+0

@ user1802785 Скорее всего, процесс закончился. Каталог fd должен быть там, даже если файлы не открыты, хотя обычно есть fd 0, 1, 2 (stdin, stdout, stderr). Обратите внимание, что это будет работать только в Linux, другие Unix не имеют символических ссылок (у OS X нет/proc) – cdarke