<blockquote>
<p>When I run C program directly through terminal its working fine. But when I run the same program with 2nd code i provided above nothing prints.</p>
</blockquote>
<p>您看不到任何输出的原因是,当程序在非交互模式下运行时,C stdio使用块缓冲。见<a href="https://stackoverflow.com/a/12471855/4279">my answer that demonstrate several solutions: ^{<cd1>}, ^{<cd2>}, ^{<cd3>}</a>。如果您可以更改C代码,那么您也可以<a href="https://stackoverflow.com/a/3746795/4279">fflush the output explicitly or make it unbuffered</a>。在</p>
<p>如果您可以一次提供所有输入,并且输出是有界的,那么您可以使用<code>.communicate()</code>:</p>
<pre><code>from subprocess import Popen, PIPE
p = Popen(["./cprog"], stdin=PIPE, stdout=PIPE, stderr=PIPE,
universal_newlines=True)
out, err = p.communicate("2\n")
</code></pre>
<hr/>
<blockquote>
<p>So what I want is user runs program in browser and enters input in textbox provided whenever needed and that input is redirected to stdin of subprocess and output based on it.</p>
</blockquote>
<p>基于<a href="https://stackoverflow.com/a/11729467/4279">ws-cli example</a>:</p>
^{pr2}$
<p>其中<code>index.html</code>:</p>
<pre><code><!doctype html>
<title>Send input to subprocess using websocket and echo the response</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
</script>
<script>
// send keys to websocket and echo the response
$(document).ready(function() {
// create websocket
if (! ("WebSocket" in window)) WebSocket = MozWebSocket; // firefox
var socket = new WebSocket("ws://localhost:8076");
// open the socket
socket.onopen = function(event) {
// show server response
socket.onmessage = function(e) {
$("#output").text(e.data);
}
// sent input
$("#entry").keyup(function (e) {
socket.send($("#entry").attr("value")+"\n");
});
}
});
</script>
<pre id=output>Here you should see the output from the command</pre>
<input type=text id=entry value="123">
</code></pre>
<p>和<code>cprog.c</code>:</p>
<pre><code>#include <stdio.h>
int main() {
int x = -1;
setbuf(stdout, NULL); // make stdout unbuffered
while (1) {
printf("Enter value of x: \n");
if (scanf("%d", &x) != 1)
return 1;
printf("Value of x: %d\n", x);
}
return 0;
}
</code></pre>