5

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

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

4

7 回答 7

7

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

  • 正如@glenn_gould 建议的那样,使用“交互式”从命令行运行求解器

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

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

    并在 ScriptToRun.py 中使用 @ellumini 建议的 waitForCompletion()

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

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

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

于 2015-05-07T21:14:38.650 回答
3

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

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

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

于 2014-06-06T20:20:51.700 回答
1

一下子流程模块。这些call方法一直等到该过程完成。与使用os.system().

于 2012-03-11T19:54:18.367 回答
1

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

import commands
(return_code, output) = commands.getstatusoutput('abaqus job=file_name cpus=2')
于 2012-03-11T20:02:20.433 回答
1

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

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

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

abaqus 作业=myProg

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

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

abaqus 工作=myProg &

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

于 2012-03-11T20:30:15.787 回答
1

不确定您是否已经找到了合适的解决方案,但工作对象:

Jobxy.waitForCompletion() 

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

于 2015-03-03T16:58:57.513 回答
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 在执行“python_name.py”之前等待 Abaqus 完成分析,但这会挂起你的 python 命令(或 GUI),直到 Abaqus 完成,这需要很长时间。

我使用的一种方法是从 Abaqus 中读取 *.sta 文件,其中包含求解时间和进度。因此,您可以编写一个序列,例如每 5 秒读取一次文件,并在执行结果提取文件之前监控作业何时结束。

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

#get results and write them to myresults.txt
os.system('abaqus python python_name.py')
于 2012-06-14T20:34:39.097 回答