我想开发一个python脚本,它使用gcc编译和运行c程序
我想用Python编写一个程序,它将C程序作为输入,对同样作为输入的测试用例执行它,并打印每个测试用例的输出。我正在使用Windows 我尝试使用subprocess.run,但它在运行时不接受输入(即动态) 来自子流程导入的我想开发一个python脚本,它使用gcc编译和运行c程序,python,c,Python,C,我想用Python编写一个程序,它将C程序作为输入,对同样作为输入的测试用例执行它,并打印每个测试用例的输出。我正在使用Windows 我尝试使用subprocess.run,但它在运行时不接受输入(即动态) 来自子流程导入的* p1=run(“rah.exe”,input=input(),stdout=PIPE,stderr=stdout,universal\u newlines=True) 打印(p1.标准输出) C代码: #包括 void main() { printf(“输入一个数字”
*
p1=run(“rah.exe”,input=input(),stdout=PIPE,stderr=stdout,universal\u newlines=True)
打印(p1.标准输出)
C代码:
#包括
void main()
{
printf(“输入一个数字”);
INTA;
scanf(“%d”和“&a”);
对于(int i=0;i我同意@juanpa.arrivillaga的建议。您可以使用subprocess.Popen
和communicate()
:
import subprocess
import sys
p = subprocess.Popen('rah.exe', stdout=sys.stdout, stderr=sys.stderr)
p.communicate()
更新:上面的脚本无法在IDLE上运行,因为IDLE会更改IO对象sys.stdout,sys.stderr
,这会破坏fileno()
函数。如果可能,您应该将代码放入python文件中(例如script.py
)然后使用以下命令从Windows命令行运行它:
python script.py
python
否则,您可以在Windows上的命令行中输入以下命令,执行类似于IDLE的操作:
python script.py
python
这将启动一个与IDLE类似但没有更改IO对象的控制台。在那里,您应该输入以下行以获得类似的结果:
import subprocess
import sys
_ = subprocess.Popen('rah.exe', stdout=sys.stdout,stderr=sys.stderr).communicate()
我尝试使用subprocess.run,但它在运行时不接受输入(即动态)
如果不执行任何操作,子进程将只继承其父进程的stdin
除此之外,因为您截取子流程的输出并在之后打印它,所以您不会得到在“预期输出”中写入的交错:输入不会回显,所以您只会得到写入子流程的标准输出,这两个标准输出都是printfs
如果您想动态地与子流程交互,您必须创建一个适当的Popen对象,对所有内容进行管道化,并使用stdin.write()和stdout.read()。因为您必须处理管道缓冲,这将是一件痛苦的事情
如果您打算经常这样做,您可能想看看:“交互式”子流程几乎就是它的面包和黄油
这是关于工作的:
从子流程导入Popen,管道
从fcntl导入fcntl、F_GETFL、F_SETFL
从操作系统导入O_非块
导入选择
p=Popen(['./a.out'],stdin=PIPE,stdout=PIPE)
fcntl(p.stdout,F_SETFL,fcntl(p.stdout,F_GETFL)| O_非块)
选择。选择([p.stdout],[],[]))
打印(p.stdout.read().decode())
d=输入()
p、 stdin.write(d.encode()+b'\n')
p、 stdin.flush()
选择。选择([p.stdout],[],[]))
打印(p.stdout.read().decode())
#包括
int main(){
printf(“输入一个数字”);
fflush(stdout);
INTA;
scanf(“%d”和“&a”);
对于(int i=0;iIt在运行时接受输入,您只需在run
之前调用input
。您可能想查看Popen.communication
您能否提供Python脚本所需的所有代码的确切代码。您在运行它时是否遇到任何错误?是的,请回溯(最近一次调用):文件“C:\Python\Python\temp2.py”,第3行,p=Popen('rah.exe',stdout=sys.stdout,stderr=sys.stderr,universal\u newlines=True)文件“C:\Python\Python\lib\subprocess.py”,第728行,init errread,errwrite)=self.\u get\u句柄(stdin,stdout,stderr)文件“C:\Python\Python\lib\subprocess.py”,第1057行,在_get_handles c2pwrite=msvcrt.get_osfhandle(stdout.fileno())io.UnsupportedOperation:fileno>>>是否要求代码必须在空闲时运行?因为空闲会更改io对象,从而破坏fileno()
function。我已经更新了我的答案,以了解运行代码的其他方法。我希望此脚本与使用gcc在cmg中执行相同的c程序一样具有交互性