2012-04-13 18 views
1

У меня есть программа атомной симуляции (написанная в Fortran, у меня нет исходного кода), которая побуждает пользователя вводить температуру, массу каждого числа атомов итераций и т. Д. ., а затем запускает симуляцию заданного входного файла (с указанием начальных положений всех атомов). После всех итераций программа выводит текстовый файл с конечными положениями атомов и закрывается.Как запустить программу из командной строки из Python

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

  1. Открыть программу моделирования («sim.exe»)
  2. ввода температуры, массы, итерации и т.д., в командной строке автоматически
  3. Выходной файл будет сгенерирован и скопирован в другой файл с другим именем, чтобы он не был перезаписан.
  4. Вернуться к числу 1, при различной температуре, но с той же массой, итераций и т.д.

Моя главная проблема это номер 2. Я не могу понять, как ввести в программу командной строки от Python. Возможно ли это? Я читал, что это будет связано с модулями os или subprocess, но я не понимаю, как они работают.

Примечание: Я использую Windows.

ответ

4
import sys 
import subprocess 

theproc = subprocess.Popen([sys.executable, "myCMDscript"]) 
theproc.communicate() 
+0

Почему 'SYS. executable'? –

+0

sys.executable, чтобы запустить другой экземпляр сам по себе или найти данные конфигурации. –

+1

OP упомянул, что подпроцесс называется 'sim.exe' - вряд ли выглядит как имя скрипта Python. –

7

Если вы можете вслепую ввод данных, не дожидаясь конкретных подсказок, эта проблема должна быть легко решить:

import os 
import shutil 
import subprocess 
import time 

proc = subprocess.Popen(["sim.exe"], stdin=subprocess.PIPE) 
while True: 
    proc.communicate(input="line1\nline2\nline3\n") 
    while not os.path.exists(outputfilepath): 
     time.sleep(1) 
    shutil.move(outputfilepath, uniq_outputfilepath) 

Конечно, это будет безопаснее для сканирования стандартный вывод и стандартный поток ошибок программы для ожидаемые и неожиданные шаблоны для продолжения или прерывания. Это было бы возможно, также установив STDOUT и STDERR арг из Popen() для subprocess.PIPE и вызова общаться, как это:

stdout, stderr = proc.communicate(input="line1\nline2\nline3\n") 

Проверьте communicate() documentation для деталей.

Если вы используете Python3, строка ввода должен быть преобразован в строку байтов, чтобы предотвратить сообщаться от повышения «TypeError:„ул“не поддерживает интерфейс буфера»:

proc.communicate(input=bytes("line1\nline2\nline3\n", "UTF-8")) 
+0

Спасибо! Однако я продолжаю получать сообщение об ошибке: TypeError: 'str' не поддерживает буферный интерфейс – teskata

+0

О, это пахнет Python3. Что-то вроде 'proc.communicate (input = bytes (" line1 \ nline2 \ nline3 \ n "," UTF-8 "))' или 'proc.communicate (input =" line1 \ nline2 \ nline3 \ n ".encode ("utf-8")) 'работа? –

+0

Просто протестировал его. Вызывается вызов bytes(). Добавит примечание для Python3 к моему ответу. –

Смежные вопросы