Отправить работу, дождаться ее завершения и после отправить другую работу - PullRequest
4 голосов
/ 11 марта 2012

Мне нужно несколько раз запустить один и тот же файл abaqus .inp (слегка измененный в пределах прогонов), и после окончания каждого прогона мне нужно представить скрипт на python abaqus, который будет читать результаты.

Я сделалследующее:

#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')

Однако основная программа выполняет вторую строку до того, как программа, запущенная в первой строке, заканчивается.В результате я получаю ошибку.Как я могу решить это?

Ответы [ 7 ]

5 голосов
/ 08 мая 2015

Я полагаю, что проблема здесь не в ожидании подпроцесса (а именно в ожидании), а в том, что после запуска решателя Abaqus требуется несколько секунд, чтобы удалить некоторые временные файлы и закрыть его odb. Я предлагаю одно из следующего:

  • запустить решатель из командной строки с помощью параметра «интерактивный», как предложено @glenn_gould

    strCommandLine = 'abaqus interactive job=jobname'  
    subprocess.call(strCommandLine)
    
  • запустить скрипт Python abaqus

    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)
    

Это был мой первый пост в этом великолепном сообществе, я был бы рад узнать, сделал ли я что-то не так.

2 голосов
/ 07 июня 2014

Я думаю, что вам нужна система ('abaqus job = inputfile.inp interactive')

Interactive не считает системную команду завершенной, пока не завершится выполнение abaqus.

Без интерактивного запуска abaqus вфон, когда системная команда закончилась, и мы перешли к следующему, что нам не нужно.

1 голос
/ 12 марта 2012

О работе в фоновом режиме, вы уверены, что это так?

Этот сайт предлагает , что os.system('abaqus job=file_name cpus=2') будет работать на переднем плане.

Использование Abaqus в пакетном режиме Чтобы вызвать систему Abaqus в пакетном режиме, необходимо указать имя файла в команде Abaqus>. Например, если вы хотите, чтобы myProg.inp оправдывался:

abaqus job = myProg

(обратите внимание, что расширение не должно следовать за именем файла)

Эта команда должна запустить Abaqus в пакетном режиме. Команда запустит программу на переднем плане. Если вы хотите запустить программу в фоновом режиме, добавьте амперсанд в конец команды:

abaqus job = myProg &

Может быть, есть параметр локальной конфигурации, который вызывает фоновую обработку? Если это так, возможно, вы можете добавить переключатель, чтобы убедиться, что обработка находится на переднем плане.

1 голос
/ 12 марта 2012

Модуль подпроцесса был рекомендован в другом ответе.Это официально рекомендуемый способ сделать это.Тем не менее, более быстрый и простой метод (также не рекомендуется в Python 3, но все еще отлично работает в 2.x, так что примите это во внимание) - это модуль commands .

import commands
(return_code, output) = commands.getstatusoutput('abaqus job=file_name cpus=2')
1 голос
/ 11 марта 2012

Посмотрите на модуль подпроцесс .Методы call ожидают завершения процесса.Вы также можете получить намного лучший контроль над дочерним процессом, чем использовать os.system().

0 голосов
/ 03 марта 2015

не уверен, что вы уже нашли адекватное решение, но объект задания:

Jobxy.waitForCompletion() 

ожидает завершения задания и затем продолжает выполнение сценария pyhton;например, с командами относительно постобработки.Подробнее см. Руководство пользователя сценариев abaqus ...

0 голосов
/ 15 июня 2012

Попробуйте использовать подпроцесс , но без опции 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 не будет выполнен, что займет много времени.

Один метод, который я использую, - это чтение файла * .sta из Abaqus, в котором есть время решения и прогресс. Таким образом, вы можете написать последовательность для чтения файла, например, каждые 5 секунд и отслеживать, когда задание заканчивается, перед выполнением файла извлечения результатов.

Еще одна хитрость для извлечения данных заключается в том, что, пока вы не используете (импортируете) классы из модуля CAE, вы можете запустить свой скрипт Python с помощью этой команды:

#get results and write them to myresults.txt
os.system('abaqus python python_name.py')
...