過去我已經成功使用subprocess
模塊,但是,我一直在努力將Fortran可執行文件傳遞給一個參數。使用參數在Python中執行Fortran子進程
它在命令行上工作:.\IMT.EXE path\to\file
就好。但是當我嘗試使用子進程模塊傳遞完全相同的參數時,IMD告訴我輸入的文件無效。不幸的是,IMT不會輸出無效的文件名,這使得調試變得困難。我知道該文件在那裏,我知道IMT正在傳遞一個參數,但由於某種原因,字符串沒有正確傳遞。我目前正在cygwin上下載gcc
,這樣我至少可以嘗試打印無效的文件名(儘管我以前從未寫過fortran)。
我嘗試過沒有成功的其他事情: 這只是掛起,什麼都不做。
p = subprocess.Popen(['.\IMT.EXE'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = p.communicate(file_path.encode())
或這個只是打印出Output:
然後什麼也沒有。
p.stdin.write(temp_i_name.encode())
p.kill()
print('Output: ', p.stdout.read().decode())
雖然我不相信這將有助於(它沒有),我也試着設置shell=True
。
我也試過os.system
os.system('.\IMT.EXE' + ' ' + file_path)
同樣的錯誤:
Input Error.
Command line argument for Inverse Modeling Toolkit must
be valid path and filename of instruction file.
其他相關信息:
- Windows 7的
- 的Python 3.3
- IMT寫在Fortran90中
- 我有IMT源代碼,但對Fortran一無所知。
我已經看過SO關於subprocess
模塊的其他帖子,但他們都沒有幫助。
編輯:
所以我終於得到它的工作。這個問題並沒有正確地處理反斜槓,但是我已經假定當子進程IMT.EXE
被打開時它會認爲它的目錄是當前工作目錄。它不是。我應該已經更清楚了,因爲我打電話給IMT:subprocess.call([os.path.join('imt', 'IMT.EXE'), file_path])
並且只傳遞file_path
作爲文件名,因爲它存在於目錄imt
中。對困惑感到抱歉。
請勿使用反斜槓。如果你這樣做,使用原始字符串。 – geoffspear
你可能會打印什麼file_path? Protip:記得總是避免反斜槓 – carlosdc
也嘗試從python中打開file_path來驗證它是否真的存在。你使用相對路徑,你可能不在你認爲的地方。 –