簡體   English   中英

Python子進程沒有正確執行程序

[英]Python subprocess not executing program correctly

我正在嘗試從 Python 在 shell 中執行 Fortran 程序。 我正在使用subprocess調用 Fortran 程序並傳遞參數(需要兩個輸入文件)。 這就是我的做法:

COMMAND = '/path/to/FORTRAN/program << !\n' + INPUT_FILE1 + '\n' + INPUT_FILE2 +'\n!'
return = subprocess.call(COMMAND, shell=True)

不幸的是,Fortran 程序退出時:

? FORTRAN Runtime Error:
? Attempt to read past end of file
? READ(UNIT=22,...

不是輸入文件或 Fortran 程序的問題。 當我在我的 shell 中執行這個時:

$>/path/to/FORTRAN/program << !
>INPUT_FILE1
>INPUT_FILE2
>!

一切都按預期工作(沒有Attempt to read past end of file )。

我無權訪問 Fortran 源代碼,因此無法檢查其中發生了什么。 我認為這與我通過subprocess進程調用程序的方式有關 - 我只是不知道是什么。

我正在使用 Python 2.6.6。

快速解釋:Fortran 程序將提示輸入兩個輸入文件,但它不會將它們識別為命令行選項(無法通過調用程序提供它們)。 如果你想從 - 比如說一個 shell 腳本(批處理模式)運行它 - 你需要捕獲返回命令來執行命令,但還需要提供兩個文件。 << ! 由於缺乏更好的術語而打開“列表”。 下面的命令被交給程序,它等待執行直到! 鍵入。

我已經多次成功地使用了這種方法(不同的 Fortran 代碼),並且使用了C shell腳本(不是 Python)。

也許它是由shell=True調用的 shell 引起的,如果這不會在您的系統上調用bash 您可以避免依賴擴展的 shell 語法<< ,而是自己構建整個調用,如下所示:

popen = subprocess.Popen(["/path/to/FORTRAN/program"], stdin=subprocess.PIPE)
popen.stdin.write('123\n')
time.sleep(0.1)    # hack, following LAK's suggestion
popen.stdin.write('456\n')
popen.stdin.close()
result = popen.wait()

不久前我遇到了類似的問題,結果證明是添加一個小暫停。 看看這個,看看該技術是否有幫助。

您可以嘗試"\\r\\n" (tty 換行符):

from subprocess import Popen, PIPE

p = Popen(["/path/to/FORTRAN/program"], stdin=PIPE,
          bufsize=1, close_fds=True)
p.communicate("INPUT_FILE1\r\nINPUT_FILE2")
rc = p.returncode

最后有/沒有"\\r\\n"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM