Запускать эквивалентные команды пакетного файла из кода Python

У меня есть этот пакетный файл (abaqusjob.bat):

@echo off
@call ifortvars.bat intel64
cd c:\ABAQUS_Jobs
abaqus job=Australian2g1065fmpc user=routinem2mpc8f8el cpus=8 gpus=1 interactive

Я хотел бы запустить его из эквивалентного кода Python, используя Popen например, вместо запуска самого пакетного файла, потому что я хочу автоматически изменить некоторые параметры в последней строке.

Есть идеи?

1 ответ

Решение

Я обычно заключаю свои вызовы в функцию, подобную этой:

def issue_command(command):
    process = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
    return process.communicate()

Затем вы можете вызвать функцию следующим образом:

stdout, stderr = issue_command("c:\ABAQUS_Jobs\abaqusjob.bat job=...")

Однако существуют проблемы безопасности при использовании shell=True с ненадежным вводом (см. https://docs.python.org/2/library/subprocess.html), который, похоже, не относится к вашему вопросу, но вы не сказали, где вы получаете данные для другого набора аргументов.

Если вы не используете "shell=True", то вы должны четко указать пути и некоторые другие вещи (см. Параграф над предупреждением по ссылке выше).

Вы также можете рассмотреть возможность использования более сложной функции в этом направлении

def issue_command(*args):
    process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)
    return process.communicate()

который будет называться так:

stdout, stderr = issue_command("c:\ABAQUS_Jobs\abaqusjob.bat", "job=Australian2g1065fmpc", "user=routinem2mpc8f8el")

Преимущества использования такой подписи можно найти здесь: https://docs.python.org/2/library/subprocess.html

РЕДАКТИРОВАТЬ: Поскольку вы сказали, что в любом случае хорошо, я выберу пакетный сценарий, потому что я не знаю, какую среду вы настраиваете с "ifortvars.bat". Поэтому для параметров в пакетном скрипте вы используете% n, где n - индекс аргумента. Таким образом:

@echo off
@call ifortvars.bat intel64
cd c:\ABAQUS_Jobs
abaqus job=%1 user=%2 cpus=%3 gpus=%4 interactive

позволит вам указать задание, пользователя, cpus и gpus соответственно. Тогда это легко вызвать в python, используя функцию, описанную выше.

def issue_command(*args):
    process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)
    return process.communicate()

args = [["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian2fmpc", "routinem2", "8", "1"],
        ["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian3fmpc", "routinem3", "4", "2"],
        ["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian4fmpc", "routinem4", "5", "3"]]

for arg in args:
    out, err = issue_command(*arg)

Я думаю, что это должно решить вашу проблему, но я сейчас на своем планшете, так что если есть ошибка, дайте мне знать ниже, и я исправлю это, как только смогу. Кроме того, ваше новое требование должно быть достаточно простым, если ваша установка на python обновила реестр (что должно иметь), все, что вам нужно сделать, это дважды щелкнуть по файлу.py, и он должен запуститься и закрыть приглашение cmd, когда закончите. Если этого не происходит, вам следует поискать в Google информацию о том, как настроить ассоциации файлов.

ПРИМЕЧАНИЕ. Эти значения являются примерами и должны быть заменены аргументами, которые вы хотите использовать. Вы также можете захотеть изменить то, что параметризовано в вашем пакетном скрипте, как я сказал, что это был пример.

Другие вопросы по тегам