Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想开发一个python脚本,它使用gcc编译和运行c程序_Python_C - Fatal编程技术网

我想开发一个python脚本,它使用gcc编译和运行c程序

我想开发一个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(“输入一个数字”

我想用Python编写一个程序,它将C程序作为输入,对同样作为输入的测试用例执行它,并打印每个测试用例的输出。我正在使用Windows

我尝试使用subprocess.run,但它在运行时不接受输入(即动态)

来自子流程导入的
*
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程序一样具有交互性