[英]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.