У меня есть простая программа на C, которая работает следующим образом: Запросить ввод Распечатать Запросить другой ввод Распечатать снова
Теперь я использую 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()
Вот несколько вещей: 1. Я видел pexpect, но я думаю, что мы должны дать то, что программа спрашивает заранее. 2. Могу ли я снова открыть закрытую трубу подпроцесса?
Я использую приведенный выше сценарий как CGI, и я не знаю, почему, но subprocess.call не будет работать в этом. Кто-нибудь может объяснить, почему?
РЕДАКТИРОВАТЬ:
Я делаю веб-проект, в котором пользователи пишут код на C, C++ или JAVA и выполняют его в браузере. Итак, сначала я подумал об использовании PHP для этого, но я не мог найти способ вызывать программы и запускать их в интерактивном режиме. Затем я увидел модуль подпроцесса Python. Все работало нормально в интерпретаторе, когда я использовал subprocess.call. Но та же самая программа Python, когда она была сохранена как .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;
}
with closing(f)
илиtry
/finally
в редкие случаи, когда это неуместно.) - person abarnert   schedule 12.01.2013client.py
просто преобразует входной текст в верхний регистр, а не интерпретирует его с помощью какого-либо языка программирования. - person jfs   schedule 12.01.2013stdout.flush()
. - person Armin Rigo   schedule 12.01.2013