如何在Python中的另一个命令后调用子进程?
我想写Python脚本。我是个新手。在这个脚本中,我想运行另一个C程序,它在输出中给出许多数字。Smth类似:如何在Python中的另一个命令后调用子进程?,python,subprocess,Python,Subprocess,我想写Python脚本。我是个新手。在这个脚本中,我想运行另一个C程序,它在输出中给出许多数字。Smth类似: 1 1 0.000000 0.000172 0.075010 0.937330 33.743876 我想用其他参数多次运行这个程序,并在一个文件中收集所有输出。在那之后,我计划使用pandas对数据进行排序并绘制一些图,但现在不重要了。我编写了以下代码: import subprocess f = open("ax-rrff.dat", "w") f
1 1 0.000000 0.000172 0.075010 0.937330 33.743876
我想用其他参数多次运行这个程序,并在一个文件中收集所有输出。在那之后,我计划使用pandas
对数据进行排序并绘制一些图,但现在不重要了。我编写了以下代码:
import subprocess
f = open("ax-rrff.dat", "w")
f.write("seed\tN\tT\tDRA\tD\tActive\tAvF\n")
p = subprocess.call(['gcc', 'ax-rrff.c', '-lm','-lgsl','-lgslcblas'])
for seed in range(1,2+1):
for N in range(1,2+1):
p = subprocess.call(['a.exe',str(seed),'1',str(N),'1000','0','0'], stdout=f)
f.close()
(小数字只是给你看)。我希望我的ax rrff.dat
是
seed N T DRA D Active AvF
1 1 0.000000 0.000172 0.075010 0.937330 33.743876
1 2 0.000000 0.003598 0.021690 1.564677 14.032332
2 1 0.000000 0.000172 0.062262 0.925817 33.329404
2 2 0.000000 0.002790 0.014749 1.423670 16.689964
然而,编译器的调度器认为以这种方式进行输出是很酷的:
1 1 0.000000 0.000172 0.075010 0.937330 33.743876
1 2 0.000000 0.003598 0.021690 1.564677 14.032332
2 1 0.000000 0.000172 0.062262 0.925817 33.329404
2 2 0.000000 0.002790 0.014749 1.423670 16.689964
seed N T DRA D Active AvF
这个问题。如何强制子进程在
f.write(“seed\tN\tT\tDRA\tD\tActive\tAvF\n”)
之后运行?好的,我在电话上,所以无法测试我的答案,但我想您的预期输出可以实现如下:
import subprocess
f = open("ax-rrff.dat", "a")
f.write("seed\tN\tT\tDRA\tD\tActive\tAvF\n")
p = subprocess.call(['gcc', 'ax-rrff.c', '-lm','-lgsl','-lgslcblas'])
for seed in range(1,2+1):
for N in range(1,2+1):
newcall = subprocess.Popen(['a.exe',str(seed),'1',str(N),'1000','0','0'], stdout=subprocess.PIPE)
newcall.wait()
output, errors = newcall.communicate()
f.write(output.decode())
f.close()
但有一件事还不清楚。。因为您在for循环外声明p
,然后再次在for循环内声明一次。。这使我相信您愿意使用第一个声明作为第二个声明的输入。。然而,您所做的只是创建一个新的声明,从而覆盖第一个声明。因此,您正在更改p
是什么,而不是以任何方式使用/执行它
进一步解释:
我将open(文件'w')
更改为open(文件'a')
,这意味着文件将是append
模式,而不是write
模式。这使您可以根据需要随时编写,并且它将按照从.python脚本中写入文件的顺序添加每一行
如果您仍然想使用
p
的第一个声明作为第二个声明的输入,请查看是否可以通过扩展插入for循环子进程的命令行命令来实现。问题在于write()
将输出放在缓冲区中,并且只定期将缓冲区刷新到磁盘。由于有多个进程写入文件,因此它们可能会在父进程之前刷新自己的缓冲区。要强制输出,只需在启动任何子进程之前调用f.flsuh()
。您可以在调用子进程之前先将输出刷新到文件中。@code peedientf=open(“ax-rrff.dat”,“w”)f.write(“seed\tN\tT\tDRA\tD\tActive\tAvF\n”)f.close()f=open(“ax-rrff1.dat”,“a”)
或者您可以刷新,而不是接近。@Code学徒哦,谢谢!我忘记了f.flush()
命令。对天气凉爽些。子流程具有Popen
属性,而不是Popen
2。如果我把f.write(“seed\tN\tT\tDRA\tD\tActive\tAvF\n”)
放在f=open(“ax rrff.dat”,“a”)
之后,我就可以用你的代码得到我想要的东西。你可以把f.write()放在顶部,但这会让你的描述行留在顶部。。我以为你想把它放在文件的底部?不!我想把它放在文件的顶部。问题是。我的编译器出于一些未知的原因(对我来说)在bottom@Dida打印在底部的是您的代码,而不是编译器。