如何使用Python获取自动运行程序

时间:2017-04-22 10:20:56

标签: python linux python-2.7 command-line subprocess

1。背景

  • 我现在正在使用大气模拟模型(名为 WRF )。该模型由其自己的控制文件 namelist.input

  • 控制
  • 当我想在一段时间内模拟大气情况时,我只需要在 namelist.input 中更改开始时间和结束时间,然后运行模型

    vim namelist.input ## Change the simulated period mpirun np -16 ./wrf.exe

2。我的尝试

当目标周期足够大(例如1年)时,长计算时间将降低结果的稳定性。 (有人可能熟悉蝴蝶效应:如果计算时间过长,模拟结果与现实相比的微小差异会变得很大)

因此,我需要将模拟时间段划分为多个子部分并多次运行模型。一个研究人员写的.csh文件可以实现我的目标。我在这里上传了它作为参考。

#!/bin/csh -f

set year = "2013"


foreach strtime (010106010600 010512011100) ## just show two periods here
set smon = `echo ${strtime}|cut -c1-2`
set sday = `echo ${strtime}|cut -c3-4`
set shr  = `echo ${strtime}|cut -c5-6`
set emon = `echo ${strtime}|cut -c7-8`
set eday = `echo ${strtime}|cut -c9-10`
set ehr  = `echo ${strtime}|cut -c11-12`

cat > namelist.input << EOF
 start_year                          = ${year},${year},
 start_month                         = ${smon},${smon},
 start_day                           = ${sday},${sday},
 start_hour                          = ${shr},${shr},
 end_year                            = ${year},${year},
 end_month                           = ${emon},${emon},
 end_day                             = ${eday},${eday},
 end_hour                            = ${ehr},${ehr},
 ... # the .csh file contain all content of __namelist.input__ with start and end time changes.  

EOF

# running  wrf
 mpirun -np 16 ./wrf.exe
end

我想编写一个Python程序来替换csh文件。 Python语言更强大(我可以在同一个 .py 程序中对输出文件进行后期处理)

3。我的问题

我曾尝试编写.py程序,以便多次自动运行WRF模型。它包含三个主要元素:

  • 将开始时间和相应的结束时间设置为列表,然后循环列表重新运行。

  • 使用不同的时间段更改 namelist.input

  • 在python环境中运行命令行程序。

     from subprocess import call
     call(["mpirun", "-np 16 ./wrf.exe"])    
    

但我对重新开始的时间点感到困惑。

  

总而言之,如何测试单个运行已经结束,我需要在Python中重新运行下一个时期的模型

1 个答案:

答案 0 :(得分:1)

所以问题是:如何检查进程是否仍在运行?

可能的解决方案:

1)创建执行模型的启动管理器脚本,并检查其他进程是否在while循环中完成?或者在模型的最后进行函数调用?

2)在每个时期结束时做一些事情,编写简单的文本文件或类似的东西。而这又被另一个过程所吸引。

3)使用psutil检查exe是否正在运行 https://github.com/giampaolo/psutil

    import psutil

    def is_alive():

        for pid in psutil.pids():
            p = psutil.Process(pid)
            if p.name() == "wrf.exe":
                print("Process is alive")
                return True

        return False