1

ユーザーに温度、各原子の質量、反復回数などを入力するように促し、指定された入力ファイルのシミュレーションを実行する原子シミュレーション プログラム (Fortran で作成された、ソース コードはありません) があります。 (すべての原子の初期位置を指定します)。すべての反復の後、プログラムは原子の最終位置を含むテキスト ファイルを出力し、閉じます。

異なる温度で同じシミュレーションを実行しようとしているので、Python を使用して入力プロセスを自動化したいと考えています。したがって、Python プログラムは次のようになります。

  1. シミュレーション プログラム ('sim.exe') を開きます。
  2. 温度、質量、繰り返しなどをコマンドラインに自動入力
  3. 出力ファイルが生成され、上書きされないように別の名前の別のファイルにコピーされます。
  4. 温度は異なりますが、質量、反復などは同じで、番号 1 に戻ります。

私の主な問題は 2 番です。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'はバッファインターフェイスをサポートしていません」が発生しないように、入力文字列をバイト文字列に変換する必要があります。

    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 に答える