2017-01-14 11 views
1

Я пытаюсь запустить сценарий Abaqus из Python через командную строку на машине Windows 8.Подождите, чтобы выполнить работу счетчика после запуска из сценария python

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить скрипт Python ждать, пока работа Abaqus не завершится, прежде чем двигаться вперед.

Ниже некоторый код, который я пытался, по одному за раз:

os.popen('abaqus job=plate ask_delete=OFF') 
os.system('abaqus job=plate ask_delete=OFF') 
os.system('abaqus job=plate ask_delete=OFF') 
subprocess.call('abaqus job=plate ask_delete=OFF',shell=True) 
subprocess.check_call('abaqus job=plate ask_delete=OFF',shell=True) 

Я также попытался с помощью команды ожидания после подпроцесса инструментов, как это:

p1 = subprocess.check_call('abaqus job=plate ask_delete=OFF',shell=True) 
p1.wait() 

Но я получаю ошибку: AttributeError: 'int' object has no attribute 'wait'.

Я не хочу использовать time.sleep(), так как это вызывает значительное количество времени простоя в моем коде. Я использую Python 3.5.2 и Anaconda 4.2.0 (64-разрядный).

ответ

5

Необходимо включить ключевое слово abaqus "interactive". например

abaqus myjob=bob1 ask_delete=off interactive

В противном случае он будет работать в фоновом режиме, и все выходные идет в bob1.log Кроме того, есть встроенная питон среда с установкой Abaqus, который может быть использован для автоматизации выполнения заданий ABAQUS. Есть больше возможностей для управления заданиями и мониторинга, если вы используете этот «abaqus» python

+0

Спасибо, я запустил код как subprocess.call ('abaqus job = plate ask_delete = OFF interactive', shell = True). Я знаю, что у Abaqus есть модуль python, но из-за несоответствия в версиях Python мне нравится простота обновления файлов .inp, а затем отправка заданий. –

2

Обе функции call(...) и check_call(...) ждут по умолчанию для завершения команды. Просто для отладки вызовите команду через Popen и запустите «abaqus» с полным путем «C: \ ... \ abaqus.exe ...».

import subprocess 

cmd = subprocess.Popen('abaqus job=plate ask_delete=OFF', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
out, err = cmd.communicate() 
code = cmd.returncode 

print(code) # should 0 to indicate the command run successfully 
print(out) # what was piped to stdout 
print(err) # what was piped to stderr 
+0

Морис, я скопировал ваш код так же, как и у вас, и скрипт python теперь ждет, пока работа Abaqus не будет завершена, прежде чем двигаться дальше. Я думаю, это потому, что команда cmd.communicate() поддерживает скрипт. Тем не менее, ваш комментарий звучит так, будто вы просто пытались отладить проблему, просто хотели проверить, если вы намеревались это как решение. –

+0

Отлично, если он работает сейчас. Это подразумевалось как решение, лично я предпочитаю Popen с правильными параметрами. –