提交工作,等待工作完成并提交另一份工作

时间:2012-03-11 19:50:23

标签: python abaqus

我需要运行多次相同的abaqus .inp文件(在运行中略有变化),并且在每次运行结束后我需要提交一个abaqus python脚本来读取结果。

我做了以下事情:

#run the programme
os.system('abaqus job=file_name cpus=2')

#get results and write them to myresults.txt
os.system('abaqus viewer noGUI=python_name.py')

但是,主程序在第一行开始的程序结束之前执行第二行。结果我收到一个错误。我该如何解决这个问题?

7 个答案:

答案 0 :(得分:5)

我想这里的问题不是关于子进程等待(实际上它等待),而是在运行解算器之后,Abaqus需要几秒钟来删除一些临时文件并关闭它的odb。我建议以下之一:

  • 使用' interactive'从命令行运行解算器正如@glenn_gould提议的那样

    strCommandLine = 'abaqus interactive job=jobname'  
    subprocess.call(strCommandLine)
    
  • 运行abaqus python脚本

    strCommandLine = 'abaqus python ScriptToRun.py -- (jobname)'  
    subprocess.call(strCommandLine)
    

    并在ScriptToRun.py中使用waitForCompletion()作为@ellumini提议

    from abaqus import *
    import job
    import sys
    
    jobname = mdb.JobFromInputFile(sys.argv[-1], sys.argv[-1]+".inp") 
    jobname.submit() 
    jobname.waitForCompletion()
    
  • 使用try语句在文件jobname.023或jobname.lck存在时运行,如:

    strCommandLine = 'abaqus job=jobname'  
    subprocess.call(strCommandLine)
    
    while os.path.isfile('jobname.023') == True:
        sleep(0.1)
    

这是我在这个宏伟社区的第一篇文章,我很高兴知道我做错了什么。

答案 1 :(得分:2)

我认为你需要系统(' abaqus job = inputfile.inp interactive')

在abaqus完成运行之前,

interactive不会认为系统命令已完成。

当系统命令结束时,没有交互式abaqus在后台运行,我们已经移动到下一个我们不想要的。

答案 2 :(得分:1)

查看subprocess模块。 call方法一直等到进程完成。与使用os.system()相比,您还可以更好地控制子进程。

答案 3 :(得分:1)

另一个答案推荐使用子进程模块。这是官方推荐的方法。但是,更快更容易的方法(在Python 3中也已弃用,但在2.x中仍然可以正常工作,因此请考虑到这一点)是commands模块。

import commands
(return_code, output) = commands.getstatusoutput('abaqus job=file_name cpus=2')

答案 4 :(得分:1)

关于在后台运行,你确定是吗?

This site suggests os.system('abaqus job=file_name cpus=2')将在前台运行。

  

在批处理模式下使用Abaqus   要以批处理模式调用Abaqus系统,必须在Abaqus>命令中指定文件名。例如,如果您希望myProg.inp执行:

     

abaqus job = myProg

     

(请注意,文件名后面没有扩展名)

     

此命令应以批处理模式启动Abaqus。该命令将在前台运行该程序。如果要在后台运行程序,请将“&”添加到命令的末尾:

     

abaqus job = myProg&

也许有一个强制后台处理的本地配置设置?如果是这样,也许你可以添加一个开关来确保处理在前台。

答案 5 :(得分:0)

尝试使用subprocess但不使用os.call选项。 您可以使用此方法在后台运行Abaqus:

import subprocess
path = location of file in any directory 
abaqusCall = 'abaqus job=file_name cpus=2'
runCommand = 'cmd.exe /c ' + abaqusCall
process = subprocess.Popen(runCommand, cwd=path)

Abaqus的问题是运行分析需要很长时间,因此如果您尝试运行“python_name.py”文件以获得结果,程序可能会因为* .odb文件而出错。尚未创建,或不包含需要提取的数据。

您可以使用命令:

process.wait()

告诉Python等待Abaqus在执行你的“python_name.py”之前完成分析,但这会挂起你的python命令(或GUI),直到Abaqus完成,这将花费很长时间。

我使用的一种方法是从Abaqus读取* .sta文件,该文件具有解决方案时间和进度。因此,您可以编写序列以每隔5秒读取一次文件,并在执行结果提取文件之前监视作业何时结束。

数据提取的另一个技巧是,只要不使用CAE模块中的(导入)类,就可以使用以下命令运行Python脚本:

#get results and write them to myresults.txt
os.system('abaqus python python_name.py')

答案 6 :(得分:0)

不确定您是否已找到适当的解决方案,但作业对象是:

Jobxy.waitForCompletion() 

等待作业完成,然后继续执行pyhton脚本;例如,关于后处理的命令。有关详细信息,请参阅abaqus脚本用户手册...