Скопируйте вывод FORTRAN (вызываемый через F2PY) в Python

1

Я использую код fortran в python через f2py. Я хотел бы перенаправить выход fortran на переменную, с которой я могу играть. Этот вопрос я нашел полезным. Перенаправление FORTRAN (вызванного через F2PY) вывода в Python

Тем не менее, я также хотел бы, чтобы код fortran записывался на терминал, а также записывал его. Это возможно?

У меня есть следующий глупый класс, который я собрал вместе с вопросом выше, а также из http://websrv.cs.umt.edu/isis/index.php/F2py_example.

class captureTTY:
    ''' 
    Class to capture the terminal content. It is necessary when you want to
    grab the output from a module created using f2py.
    '''
    def __init__(self,  tmpFile = '/tmp/out.tmp.dat'):
        ''' 
        Set everything up
        '''
        self.tmpFile = tmpFile       
        self.ttyData = []
        self.outfile = False
        self.save = False
    def start(self):
        '''
        Start grabbing TTY data. 
        '''
        # open outputfile
        self.outfile = os.open(self.tmpFile, os.O_RDWR|os.O_CREAT)
        # save the current file descriptor
        self.save = os.dup(1)
        # put outfile on 1
        os.dup2(self.outfile, 1)
        return
    def stop(self):
        '''
        Stop recording TTY data
        '''
        if not self.save:
            # Probably not started
            return
        # restore the standard output file descriptor
        os.dup2(self.save, 1)
        # parse temporary file
        self.ttyData = open(self.tmpFile, ).readlines()
        # close the output file
        os.close(self.outfile)        
        # delete temporary file
        os.remove(self.tmpFile)

В настоящее время мой код выглядит примерно так:

from fortranModule import fortFunction
grabber = captureTTY()
grabber.start()
fortFunction()
grabber.stop()

Моя идея состоит в том, чтобы иметь флаг, который называется silent, который я мог бы использовать, чтобы проверить, разрешаю ли вывод fortran выводиться или нет. Затем это будет передано в captureTTY, когда я его построю, т.е.

from fortranModule import fortFunction
silent = False
grabber = captureTTY(silent)
grabber.start()
fortFunction()
grabber.stop()

Я не совсем уверен, как это реализовать. Очевидное, что нужно сделать:

from fortranModule import fortFunction
silent = False
grabber = captureTTY()
grabber.start()
fortFunction()
grabber.stop()
if not silent:
    for i in grabber.ttyData:
        print i

Я не большой поклонник этого, так как мой метод fortran занимает много времени, и было бы неплохо увидеть его обновленным в реальном времени, а не только в конце.

Есть идеи? Код будет работать на машинах Linux и Mac, а не на окнах. Я посмотрел вокруг сети, но не нашел решения. Если есть, я уверен, что это будет болезненно очевидным!

Ура,

г

Уточнение:

Из комментариев я понимаю, что вышеизложенное не является самым ясным. В настоящее время у меня есть возможность записывать выходные данные из метода fortran. Однако это не позволяет печатать на экране. Я могу распечатать его на экране, но потом не могу его записать. Я хочу иметь возможность делать оба одновременно, т.е. Записывать вывод и распечатывать его на экране в режиме реального времени.

Как и в стороне, код fortran является подходящим алгоритмом, и фактический вывод, который меня интересует, является параметрами для каждой итерации.

  • 0
    Может быть, вам не нравится эта идея, но я обычно прошу Фортрана записать вывод в файл журнала с частой очисткой, а затем попросить python или другие сценарии заглянуть в журнал.
  • 1
    Как выглядит вывод на фортран? Это массив чисел? Если это так, то f2py должен быть в состоянии передать это обратно в виде пустого массива.
Показать ещё 6 комментариев
Теги:
stdout
f2py

1 ответ

0

Вы пробовали что-то подобное в подпрограмме Fortran? (Предполагая, что foo - это то, что вы хотите распечатать, а 52 - номер устройства вашего файла журнала)

write(52,*) foo
write(*,*) foo

Это должно печатать foo в файле журнала и на экране.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню