簡體   English   中英

以交互方式在Python中運行外部可執行文件

[英]Running an external executable in Python interactively

使用gcc test.c -o test.exe一個簡單的C程序:

        /* TEST.C */
#include <stdio.h>
#include <string.h>
#define TRUE 1

int main (void)
{
  char p[256];
  strcpy(p, "start\0");
  printf("Welcome!\n");
  while (TRUE)
  {
    printf("Input: ");
    if (fgets(p, 255, stdin) == NULL)  break;
    if (p[0] == 'q')                   break;
    printf("You Entered: %s\n", p);
  }
  return 0;
}

Python中的子流程模塊預示着將啟動一個程序並獲取其stdinstdout 使用以上程序進行簡單測試:

import subprocess
from subprocess import PIPE, STDOUT

output = open("test.out","w")
ris = subprocess.Popen(executable="test.exe", args="", stdin=PIPE,
                       stdout=output, stderr=STDOUT,
                       universal_newlines=True, shell=True)  
com = ris.communicate(input='bye\n')
com = ris.communicate(input='q\n')
output.close()

似乎在第一個通訊命令上無限循環,將test.out填充為:

Welcome!
You Entered: bye
You Entered: bye
You Entered: bye
You Entered: bye
.
.
.

直到用戶中斷python進程。 使用ris.stdin.write('bye\\n')而不是communicate似乎並不跟隨,即使通過在所有輸入發送ris.stdin.flush()

subprocess交互運行可執行文件的正確方法是什么? 目的是讓程序的單個實例在后台運行,同時通過stdin傳遞多個輸入,並從stdoutstderr中讀取相應的輸出

除了已提及的C程序錯誤外,您多次調用.communicate() .communicate()是一次性函數,它將其所有數據發送到子流程,並等待子流程退出。

如果必須使用.communicate() ,請按以下方式使用它:

com = ris.communicate(input='bye\nq\n')

另外,您可以使用ris.stdin.write() ,如下所示:

import subprocess
from subprocess import PIPE, STDOUT

output = open("test.out","w")
ris = subprocess.Popen(executable="/tmp/test.exe", args="", stdin=PIPE,
                       stdout=output, stderr=STDOUT,
                       universal_newlines=True, shell=True)
com = ris.stdin.write('bye\n')
com = ris.stdin.write('q\n')
ris.stdin.flush()
output.close()
ris.wait()

暫無
暫無

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

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