在Python中复制FORTRAN(通过F2PY调用)输出

时间:2012-05-29 17:02:16

标签: python unix stdout f2py

我通过f2py在python中使用了一些fortran代码。我想将fortran输出重定向到我可以使用的变量。这个问题我觉得很有帮助。 Redirecting FORTRAN (called via F2PY) output in 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代码是一个拟合算法,我感兴趣的实际输出是每次迭代的参数。

1 个答案:

答案 0 :(得分:0)

你在Fortran子程序中尝试过类似的东西吗? (假设foo是您要打印的内容,52是您的日志文件的单元号)

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

这应该将foo打印到日志文件和屏幕。