我需要运行多次相同的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')
但是,主程序在第一行开始的程序结束之前执行第二行。结果我收到一个错误。我该如何解决这个问题?
答案 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脚本用户手册...