首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python获取自动运行程序

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

Stack Overflow用户
提问于 2017-04-22 10:20:56
回答 1查看 112关注 0票数 0

1.背景

  • 我现在使用的是大气模拟模型( WRF)。模型由自己的控制文件namelist.input控制。
  • 当我想在一定时间内模拟大气状况时,只需更改namelist.input,中的开始时间和结束时间,然后运行vim namelist.input ## Change the simulated period mpirun np -16 ./wrf.exe模型。

2.我的尝试

当目标周期足够大(如1年)时,较长的计算时间会降低计算结果的稳定性。(有人可能熟悉蝴蝶效应:如果计算时间太长,即使模拟结果与实际结果相差不大,也会变得巨大)

因此,我需要将模拟周期分成几个子部分,并多次运行模型。有一个.csh文件是由一位研究者编写的,可以达到我的目标。我把它上传到这里作为参考。

代码语言:javascript
复制
#!/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

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

3.我的问题

我曾多次尝试为自动运行WRF模型编写一个.py程序。它包含三个主要内容:

  • 将启动时间和相应的结束时间设置为 list ,然后循环列表以重新运行。
  • 随着时间周期的变化而改变namelist.input
  • 在python环境中运行命令行程序。 从子进程导入调用(“mpirun”,"-np 16 ./wrf.exe")

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

话说回来,--如何测试一次运行--已经结束,我需要在Python中为下一段时间重新运行该模型。

EN

回答 1

Stack Overflow用户

发布于 2017-04-22 12:34:38

因此,问题是:如何检查进程是否仍在运行?

可能的解决办法:

1)创建执行模型的start manager脚本,并检查其他进程是否在while循环中完成?还是在你的模型结束时进行函数调用?

2)在每段时间结束时做些事情,写一些简单的文本文件或类似的东西。另一个过程就会发现这一点。

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

代码语言:javascript
复制
    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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43558038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档