我有一个原子模拟程序(用Fortran写的,我没有源代码)提示用户输入温度,每个原子的质量迭代次数等,然后运行一个模拟a给定输入文件(指定所有原子的初始位置)。在所有迭代之后,程序输出一个包含原子最终位置的文本文件,然后关闭。
我正在尝试在不同温度下运行相同的模拟,因此我希望通过 Python 自动执行输入过程。因此,Python 程序将:
- 打开模拟程序('sim.exe')
- 自动将温度、质量、迭代次数等输入命令行
- 将生成输出文件并将其复制到另一个不同名称的文件中,以免被覆盖。
- 回到第 1 个,在不同的温度下,但质量、迭代次数等相同。
我的主要问题是第 2 个问题。我不知道如何从 Python 输入命令行程序。有可能吗?我读过它与 os 或 subprocess 模块有关,但我不清楚它们是如何工作的。
注意:我使用的是 Windows。
请您参考如下方法:
如果您可以不等待特定提示而盲目输入您的数据,问题应该很容易解决:
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' does not support the buffer interface”:
proc.communicate(input=bytes("line1\nline2\nline3\n", "UTF-8"))
