【问题标题】:Submit a job, wait for its completion and after submit another job提交作业,等待其完成,然后提交另一个作业
【发布时间】:2012-03-28 08:04:20
【问题描述】:

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

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

【问题讨论】:

  • 是的,但我的情况是:“您正在启动的进程可能会自行分离以在后台运行,在这种情况下,Dor 给出的 subprocess.Popen + wait 示例将无济于事。”跨度>
  • 这对我有用(但是我还没有尝试过交互式,也许它会起作用): os.system('abaqus job=file_name') PATH='...\\file_name.lck ' 如果不是 path.exists(PATH): time.sleep(1) while path.exists(PATH) and path.isfile(PATH) and access(PATH, R_OK): temp = 0 else: odb = openOdb(path=' file_name.odb') 希望这对其他人有所帮助

标签: python abaqus


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 嗨!是的,还有另一个关于此的线程,但我的问题似乎不太好,因为我没有让第二行运行。也许子流程模块需要有一个输出。就我而言,我只需要它完成,因为它不会返回任何东西。非常感谢!
      • AFAIK, subprocess 是当前推荐的使用系统调用的方法(正如@Multimedia Mike 在另一个答案中提到的那样)。问题是如果 abaqus 开始在后台运行,这意味着它将与子进程调用的进程分离。如果是这种情况,正如有人在另一个问题中所说,您应该检查如何使 abaqus 在前台运行。如果这不能完成,那么您应该编写自己的循环来监视 abaqus 后台进程以查看它何时结束。
      • 我认为您需要的参数是 "abaqus interactive" ,大概与默认的 "abaqus 背景" (www-h.eng.cam.ac.uk/help/amb/programs/fe/faq68/abaqusf2.html) 不同
      【解决方案4】:

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

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

      【讨论】:

      • 嗨!问题是第一个程序不会返回任何内容,它只需要完成即可。一旦它有第二行将完成其余的工作。这是我应该做的吗? subprocess.call([os.system('abaqus job=file_name cpus=2')]) subprocess.call([os.system('abaqus viewer noGUI=python_name.py')])
      • 此时我有点困惑——听起来你想调用第一个命令,阻塞直到该命令完成,然后调用第二个命令。我刚刚测试了 os.system() 和 commands.getstatusoutput()——它们都愉快地阻塞,直到命令完成执行。您的命令是否分叉后台进程并立即返回?
      • 嗨!我调用的程序作为后台程序运行,因此我在另一个线程中读到:“您正在启动的进程可能会自行分离以在后台运行,在这种情况下 subprocess.Popen + wait Dor 给出的示例将无济于事。”任何 cmets 将不胜感激。
      • 您有几个选择: 1) 修改abaqus 的源代码,使其在其子进程完成之前不退出(可能添加一个命令行选项以阻塞模式运行程序)。 2) 修改abaqus运行时写入文件,完成后删除;轮询/选择该文件。 3) 获取 abaqus 子进程的 PID,并在继续之前检查它们何时完成。
      • 好的!我会尝试,但也许最好澄清我的问题。我正在使用一个给定的程序来读取 python 来控制我的分析。所以这个主要的python脚本调用abaqus并提交一个作业(job=file_name),然后在abaqus完成作业后,主要的python脚本提交一个abaqus python脚本,它将读取abaqus结果文件并将一些结果提取到一个txt文件。最后,主 python 脚本将读取 txt 文件。我的问题是主程序执行此操作时没有检查 abaqus 是否已完成,并且出现错误。
      【解决方案5】:

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

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

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

      abaqus 作业=myProg

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

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

      abaqus 作业=myProg &

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

      【讨论】:

      • 好的。这有帮助。所以我使用了 subprocess.call([os.system('abaqus job=file_name cpus=2')]) subprocess.call([os.system('abaqus viewer noGUI=python_name.py')]) 但第二行是从来没有打电话。我不知道为什么会这样。我确定它不会读取第二行,因为如果我在没有第一行(插入注释符号)的情况下调用第二行,它会运行并且我得到预期的结果(因为输出文件存在)。
      • 如果我使用 subprocess.call([os.system('abaqus job=file_name cpus=2')]),我还会收到错误“'int' 类型的参数不可迭代”跨度>
      • 哇!不要那样做。 :-) 使用 subprocess 或 os.system(),但不能同时使用。
      • 是的,很抱歉。尽管如此,我还是跑步。虽然第二行没有。如果我使用 subprocess.call(['abaqus job=file_name cpus=2']) 我得到一个错误:系统找不到指定的文件...如果我使用 os.system 它不会运行第二行并挂起。
      • 如果 abaqus 不在您的 PATH 上,您可能需要指定完整路径。
      【解决方案6】:

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

      Jobxy.waitForCompletion() 
      

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

      【讨论】:

        【解决方案7】:

        尝试使用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')
        

        【讨论】:

          猜你喜欢
          • 2019-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多