繁体   English   中英

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

[英]Submit a job, wait for its completion and after submit another job

我需要运行多次相同的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')

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

我想这里的问题不是关于子进程等待(实际上它等待),而是在运行求解器之后,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) 

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

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

在abaqus完成运行之前,interactive不会认为系统命令已完成。

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

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

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

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

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

该站点建议 os.system('abaqus job=file_name cpus=2')将在前台运行。

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

abaqus job = myProg

(注意,文件名后面不能有扩展名)

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

abaqus job = myProg&

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

尝试使用 ,但没有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')

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

Jobxy.waitForCompletion() 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM