python - 我想开发一个使用 gcc 编译和运行 c 程序的 python 脚本
问题描述
我想用 Python 编写一个程序,它以 C 程序作为输入,针对同样作为输入的测试用例执行它,并打印每个测试用例的输出。我正在使用 Windows
我尝试使用 subprocess.run 但它在运行时不接受输入(即动态)
from subprocess import *
p1=run("rah.exe",input=input(),stdout=PIPE,stderr=STDOUT,universal_newlines=True)
print(p1.stdout)
C代码:
#include<stdio.h>
void main()
{
printf("Enter a number");
int a;
scanf("%d",&a);
for(int i=0;i<a;i++)
{
printf("%d",i);
}
}
python空闲时的预期输出:
Enter a number
5
01234
实际输出:
5
Enter a number 01234
解决方案
我同意@juanpa.arrivillaga 的建议。您可以为此使用subprocess.Popen
和communicate()
:
import subprocess
import sys
p = subprocess.Popen('rah.exe', stdout=sys.stdout, stderr=sys.stderr)
p.communicate()
更新:上面的脚本在 IDLE 上不起作用,因为 IDLE 更改了sys.stdout, sys.stderr
破坏fileno()
函数的 IO 对象。如果可能,您应该将代码放入 python 文件(例如script.py
),然后使用以下命令从 Windows 命令行运行它:
python script.py
或者,如果没有,您可以在 Windows 的命令行上执行类似于 IDLE 的操作,方法是输入以下命令:
python
这将启动一个类似于 IDLE 但没有更改的 IO 对象的控制台。您应该在此处输入以下行以获得类似的结果:
import subprocess
import sys
_ = subprocess.Popen('rah.exe', stdout=sys.stdout,stderr=sys.stderr).communicate()
推荐阅读
- r - 如何使用 R 中的 for 循环基于列创建数据框的子集
- android - Android Kotlin:使用 EXTRA_OUTPUT 保存的照片为 0 字节
- php - 如何使用 PHP 将正确的日期从 mdY 转换为 Ymd
- angular - 修剪字段值并在 onchange 事件 angular 中设置值
- debugging - 压力测试并发:如何减慢我的应用程序中的线程执行速度?
- javascript - SyntaxError:导入声明只能出现在带有 gulp 网页的模块的顶层
- c# - 服务总线重试逻辑:更喜欢队列重试还是实现 Polly?
- tkinter - tkinter:具有不同颜色的进度条
- c++ - 删除列表的一部分 C++
- ios - 将 Unicode 字符串显示为表情符号