1

f2pyを介してpythonでfortranコードを使用しています。Fortran の出力を、操作できる変数にリダイレクトしたいと思います。私が役に立ったこの質問があります。 Python での FORTRAN (F2PY 経由で呼び出される) 出力のリダイレクト

ただし、オプションで 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()

私の考えは、Fortran 出力の表示を許可するかどうかを確認するために使用できる、silent というフラグを用意することです。これは、作成時に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 メソッドは実行に時間がかかるため、私はこれが好きではありません。最後だけでなく、リアルタイムで更新されるのを確認できればうれしいです。

何か案は?コードは、Windows ではなく、Linux および Mac マシンで実行されます。私はウェブを見回しましたが、解決策が見つかりませんでした。あるとしたら、それは痛いほど明白になると確信しています!

乾杯、

G

明確化:

コメントから、上記が最も明確ではないことがわかります。私が現在持っているのは、fortran メソッドからの出力を記録する機能です。ただし、これにより、画面に印刷できなくなります。画面に印刷することはできますが、記録することはできません。両方を同時に実行するオプションが必要です。つまり、出力を記録し、リアルタイムで画面に出力します。

余談ですが、fortran コードは適切なアルゴリズムであり、私が興味を持っている実際の出力は各反復のパラメーターです。

4

1 に答える 1

0

Fortran サブルーチンでこのようなことを試しましたか? foo(が印刷したいもので、52 がログ ファイルのユニット番号であると仮定します)

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

これはfoo、ログ ファイルと画面に出力されます。

于 2012-06-13T16:04:22.613 に答える