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

2024-09-27 00:13:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写Python脚本。我是个新手。在这个脚本中,我想运行另一个C程序,它在输出中给出许多数字。Smth类:

1   1   0.000000    0.000172    0.075010    0.937330    33.743876

我想用其他参数多次运行这个程序,并在一个文件中收集所有输出。之后,我计划使用pandas对数据进行排序并绘制一些图,但现在这并不重要。我写了以下代码:

^{pr2}$

(小数字只是为了给你看)。我希望我的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")之后运行?在


Tags: 文件数据程序脚本pandas参数排序数字
2条回答

好吧,我上午好手机无法测试我的答案,但我想您的预期输出可以这样实现:

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,然后又在循环内部声明了一次。。这使我相信您愿意使用第一个声明作为第二个声明的输入。。但是,您所做的只是做一个新的声明,从而覆盖第一个声明。所以您正在更改p是什么,而不是以任何方式使用/执行它。。在

进一步说明:

我将open(file, 'w')改为open(file, 'a'),这意味着文件将是append模式,而不是{}模式。这允许你写任何你想写的频率,它将按写入文件的顺序添加每一行从内部你的python脚本。在

如果您仍然想使用p的第一个声明作为第二个声明的输入,请查看是否可以通过将插入到for循环中的子进程中的命令行命令进行扩展。在

问题是write()将输出放在缓冲区中,并且只定期将缓冲区刷新到磁盘。由于有多个进程正在写入文件,因此它们可能在父进程之前刷新自己的缓冲区。要强制输出,只需在启动任何子进程之前调用f.flsuh()。在

相关问题 更多 >

    热门问题