如何在Python中的另一个命令后调用子进程?

如何在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

我想写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.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 peedient
f=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打印在底部的是您的代码,而不是编译器。