2012-12-12 30 views
2

過去我已經成功使用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中。對困惑感到抱歉。

+3

請勿使用反斜槓。如果你這樣做,使用原始字符串。 – geoffspear

+0

你可能會打印什麼file_path? Protip:記得總是避免反斜槓 – carlosdc

+0

也嘗試從python中打開file_path來驗證它是否真的存在。你使用相對路徑,你可能不在你認爲的地方。 –

回答

1

我的猜測是,你錯誤地傳遞文件名。例如,你是否正確地逃避反斜槓?你說你在調用這個程序之前編寫了這個文件,你是否記得沖洗這個文件,使它實際上在物理上位於磁盤上?

你能告訴我們你是如何定義文件名嗎?

另一種選擇:在調用外部進程之前立即添加一個pdb斷點。當你的腳本停止在那一點時,打開另一個窗口,看看文件是否在那裏。

相關問題