![](/img/trans.png)
[英]Fortran run-time error when using statsmodels in Python
[英]Fortran code gives error only when run through python
我有一個 python 代碼(我們稱之為'pycode.py'),它創建一個.txt 文件('fortc.txt')。 該文件需要通過fortran90代碼生成的a.exe('f90code.exe')讀取。 fortran 代碼然后執行一些操作並將結果寫入另一個.txt 文件('res_tc.txt'),之前通過 pycode.py 創建,pycode.py 最終將讀取和打印。 這是 python 代碼:
import csv
import sys, os
import numpy as np
with open('fortc.txt', 'w') as g:
writer = csv.writer(g, delimiter=" ", quoting=csv.QUOTE_NONE, escapechar=' ')
writer.writerow(['1', '2', '3', '4'])
f = open('res_tc.txt','w+')
os.system('./f90code.exe')
readres = np.loadtxt('res_tc.txt')
tc = float(readres)
print(tc)
f.close()
如果我手動創建文件“fortc.txt”,然后只運行 f90 代碼,而不通過 python,一切正常,我得到了預期的結果。 但是,如果我通過 python 運行所有內容,則會正確創建“fortc.txt”,但顯然 fortran 無法正確讀取它。 事實上,“fortc.txt”中的所有內容都被讀取為“0.0000000000000”,執行操作時會產生以下錯誤:
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DENORMAL
顯然我得到了一個“NaN”。 此外,看起來 fortran 沒有正確運行 do 循環,因為如果我嘗試在 do 循環內打印某些內容,我不會打印出任何內容。 以下是讀取文件的 f90 代碼部分:
program tc
real*8, allocatable:: ne(:), kt(:), abund(:), z(:)
integer:: i, j, ndati, n
data ab/0.,0.1,0.31623,1./
open(96,file='fortc.txt',status='old')
n=0
do
read(96,*,end=320)
n=n+1
end do
320 continue
ndat=n
allocate(ne(ndat), kt(ndat), abund(ndat), z(ndat))
rewind(96)
do j=1, ndat
read(96,*) kt(j), abund(j), ne(j), z(j)
print*, kt(j)
end do
end program
f90 結束時的打印調用沒有結果,只有上面顯示的錯誤和“NaN”(源自 python 代碼中的打印)。 另一方面,如果將 print 語句帶到 do 循環之外,我會打印一些東西('0.00000000',如上所述)。 同樣,只有在通過 python 運行編譯的 fortran 代碼時才會發生這種情況,而如果我只是從終端運行.exe,它會按預期工作。
do循環的處理方式有什么問題嗎? .txt 文件中的數字沒有正確讀取,並且沒有執行打印,這表明我可能存在問題。 但是,我無法修復它。
當您調用 fortran 代碼時,您的輸入文件為空:
with open('fortc.txt', 'w') as g:
默認情況下,Python 將刷新寫入此文件的數據,並在退出with
正文時將其關閉。 但是您在其中包含了對 fortran 代碼的調用。
如果您想使用with
進行文件操作,請以這種方式重新排列您的代碼:
import csv
import sys, os
import numpy as np
with open('fortc.txt', 'w') as g:
writer = csv.writer(g, delimiter=" ", quoting=csv.QUOTE_NONE, escapechar=' ')
writer.writerow(['1', '2', '3', '4'])
f = open('res_tc.txt','w+') # not sure why the frotran program would output to "f" just because it is open. If it does, ok, it will wrk.
os.system('./f90code.exe')
readres = np.loadtxt('res_tc.txt')
tc = float(readres)
print(tc)
f.close() # you can use explicit open and close calls for fortc.txt as well
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.