1

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

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

  1. 打开模拟程序('sim.exe')
  2. 自动将温度、质量、迭代次数等输入命令行
  3. 将生成输出文件并将其复制到另一个名称不同的文件中,以免被覆盖。
  4. 回到数字 1,在不同的温度下,但质量、迭代等相同。

我的主要问题是第二个问题。我不知道如何从 Python 输入命令行程序。甚至可能吗?我读过它与 os 或 subprocess 模块有关,但我不清楚它们是如何工作的。

注意:我使用 Windows。

4

2 回答 2

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 参数设置为 subprocess.PIPE 并像这样调用通信来实现:

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

查看communicate() 文档了解详细信息。

如果使用 Python3,必须将输入字符串转换为字节字符串,以防止通信引发"TypeError: 'str' does not support the buffer interface"

    proc.communicate(input=bytes("line1\nline2\nline3\n", "UTF-8"))
于 2012-04-13T20:19:05.880 回答
4
import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myCMDscript"])
theproc.communicate()
于 2012-04-13T19:49:54.607 回答