2011-10-07 110 views
1

我想從python調用一個Fortran程序。我使用子進程中的Popen語句,如下所示:Python:用子進程調用Fortran並通過通信發出命令

p = Popen(['./finput'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) 

然後我想發送一些文件名到fortran程序。 Fortran程序從標準輸入讀取它們,然後打開文件。 如果我使用類似:

p_stdout = p.communicate(input='file1.dat\nfile2.dat\n')[0] 

一切都很好,和Fortran程序工作正常。 但是我想給文件名作爲python程序內的變量。 所以,如果我用

p_stdout = p.communicate(input=file1+'\n'+file2+'\n')[0] 

我Fortran程序無法打開文件名。該問題是,FORTRAN讀取字符串看起來像這樣

f i l e 1 . d a t 

一個空白字符作爲第一個字符,一些奇怪的字符其間的每一個正確的字符。不幸的是,如果您單獨打印字符串的每個字符,這隻會顯示出來。如果你只是用

print*,file1 

打印的文件名,你得到

file1.dat 

所以我的問題是,爲什麼蟒蛇把這些奇怪的字符與子進程通信,更重要的是,如何我是否擺脫了?

千恩萬謝

+0

你在哪裏獲取文件名?即如何創建'file1','file2'等? –

+0

您可以顯示'print((file1,file2))'顯示的內容。 – glglgl

回答

2

聽起來像是你的Fortran可能是你使用Python 3會得到統一,?如果是這樣,然後構建要傳遞的字符串,然後使用字符串.encode()

+1

謝謝,這是訣竅。我找到了一個更好的方法,使用'p.stdin.write(string)',然後在最後進行通信以獲取cild進程的返回值。但'.encode()'解釋發生了什麼問題:-) –

相關問題