我有一個簡單的C程序,它的工作方式如下: 請輸入 打印 向另一個輸入 重新打印讀/寫同時蟒蛇subprocess.Popen
現在IAM的使用Python來調用這個程序。
import subprocess
sobj = subprocess.Popen("./cprog", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
sobj.stdin.write("2 3\n")
sobj.stdin.close()
sobj.stdout.read()
這工作正常。同溝通工作一樣好。
但是,當我嘗試做這樣的事情,它不會工作
sobj = subprocess.Popen("./cprog", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
sobj.stdout.readline()
sobj.stdin.write("2 3\n")
sobj.stdin.close()
sobj.stdout.read()
這裏有幾件事情: 我看見Pexpect的,但我認爲我們應該給予提前問什麼程序。 2.我可以重新打開關閉的子流程管道嗎?使用
蔭上面的腳本作爲CGI,我不知道爲什麼,但subprocess.call不會在工作。誰能解釋爲什麼?
編輯:
蔭做一個基於Web的項目,用戶使用C,C++或Java編寫代碼並執行他們的瀏覽器。所以我首先想到了使用PHP,但我找不到一種方法來調用程序並以交互方式運行它們。然後我看到了python子進程模塊。當我使用subprocess.call時,在解釋器中一切正常。但是,將它保存爲.cgi並在瀏覽器中打開它時,它不起作用。然後我開始查看subprocess.popen。但是,我需要在開始時輸入所有輸入,然後運行代碼。我想要做的是在瀏覽器中運行一個交互式會話。
編輯2: 所以我想要的是用戶在瀏覽器中運行程序,並在需要時輸入文本框中輸入,並將輸入重定向到子進程的標準輸入和基於它的輸出。
編輯3:cprog.c
#include <stdio.h>
int main() {
int x;
printf("Enter value of x: \n");
scanf("%d", &x);
printf("Value of x: %d\n", x);
return 0;
}
只說 「是行不通的」,是永遠不會有幫助;你必須告訴我們你想要發生什麼,以及實際發生了什麼。 (兩次)。另外,這似乎是介於3到6個不同的問題之間,並且不清楚他們大多數都在問什麼,所以我不確定你期望得到的答案是什麼。 – abarnert
清楚的答案是一個明確的問題:「我可以重新打開關閉的子流程管道嗎?」沒有。在Python中沒有「重新打開」API文件和文件類對象,或者它基於C或POSIX標準。如果關閉文件,則無法再使用它。所以,只有在完成之前不要關閉它。 (如果你已經關閉它,因爲你可能會立即提前退出函數,但問題是你可能不會退出,正確的解決方案是使用'finally(f)'或'try' /'finally '在罕見的情況下,這是不適當的。) – abarnert
[這是答案的基礎](http://stackoverflow.com/a/11729467/4279)*「我想要做的是運行交互式會話在瀏覽器中。「*問題。 'client.py'只是將其輸入文本轉換爲大寫,而不是使用某種編程語言對其進行解釋。 – jfs