如何从Python运行命令行程序

时间:2012-04-13 19:46:30

标签: python command-line

我有一个原子模拟程序(用Fortran编写,我没有源代码),提示用户输入温度,每个原子的质量数量的迭代次数等,然后运行模拟给定输入文件(指定所有原子的初始位置)。在所有迭代之后,程序输出一个包含原子最终位置的文本文件,然后关闭。

我正在尝试在不同的温度下运行相同的模拟,所以我希望通过Python自动化输入过程。因此,Python程序将:

  1. 打开模拟程序('sim.exe')
  2. 自动将温度,质量,迭代等输入命令行
  3. 将生成输出文件并将其复制到另一个不同名称的文件中,以便不会覆盖该文件。
  4. 回到第1,在不同的温度,但相同的质量,迭代等。
  5. 我的主要问题是数字2.我无法弄清楚如何从Python输入命令行程序。它甚至可能吗?我已经读过它会与操作系统或子进程模块有关,但我不清楚它们是如何工作的。

    注意:我使用的是Windows。

2 个答案:

答案 0 :(得分: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()的stdout和stderr args设置为subprocess.PIPE并调用这样的通信来实现:

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

查看communicate() documentation了解详情。

如果使用Python3,则必须将输入字符串转换为字节字符串,以防止提出通信“TypeError:'str'不支持缓冲区接口”

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

答案 1 :(得分:4)

import sys
import subprocess

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