2

SOや他のサイトでさまざまなトピックを読んだことがありますが、質問や問題に直接答えることができません。現在、Fortranプログラムを実行するために行われた呼び出しが正しく機能していないことを除いて、完全に正常に実行されるこのpythonスクリプトがあります。サブプロセスコマンド、os.systemコマンドを使用して、Pythonで開かれたbashスクリプトファイルを開いてみましたが、うまくいきませんでした。これが私が得ているいくつかの例とエラーです。

1つのattmept:

subprocess.Popen(["sh", "{0}{1}".format(SCRIPTS,"qlmtconvertf.sh"), "qlmt"], shell=False, stdout=subprocess.PIPE)

これにより、プログラムがファイルを正しく読み取ることができないというエラーが発生します。

    forrtl: severe (24): end-of-file during read, unit 1, file /home/akoufos/lapw/Ar/lda/bcc55_mt1.5_lo_e8_o4/DOS/lat70/qlmt

別の試み:

subprocess.Popen(["./{0}{1}".format(SOURCE,"qlmtconvertf"), "qlmt"], shell=False, stdout=subprocess.PIPE)

これにより、ファイルが見つからないというエラーが発生します。

    File "/home/akoufos/lapw/Scripts_Plots/LAPWanalysis.py", line 59, in DOS
subprocess.Popen(["./{0}{1}".format(SOURCE,"qlmtconvertf"), "qlmt"], shell=False, stdout=subprocess.PIPE)
    File "/usr/lib64/python2.7/subprocess.py", line 672, in __init__
errread, errwrite)
    File "/usr/lib64/python2.7/subprocess.py", line 1202, in _execute_child
raise child_exception
    OSError: [Errno 2] No such file or directory

さらに別の試み:

os.system("{0}{1}".format(SOURCE,"qlmtconvertf qlmt"))

これにより、最初の例と同等のエラーが発生します。すべての例で、FortranソースファイルがあるSOURCE = "/ home / myusername / lapw / Source /"、SCRIPTS = "/ home / myusername / lapw / Scripts_Plots /"、ここに他のファイルとpythonスクリプトがありますqlmtconvertfはコンパイルされたFortranプログラムであり、qlmtはqlmtconvertfが読み取るファイルです。このソースコードは、何度も行ったようにシェルで呼び出すと完全に正常に機能しますが、これらのコードの呼び出しを自動化しようとしています。私は必要なことを実行するbashスクリプトも作成しましたが、代わりにPythonを介してすべてを実行しようとしています。私が間違って行っていることや起こっていることに対するアイデア、提案、または回答をいただければ幸いです。よろしくお願いします。

編集:私はそれをフランシスによって以下に与えられた提案で動作させました。os.path.joinプログラムを正しく呼び出すには、完全なパス(つまり、/ home / username / etc)とを保持する必要がありました。

    import os.path
    LAPW = "/home/myusername/lapw/"
    SOURCE = os.path.join(LAPW,'Source')
    SCRIPTS = os.path.join(LAPW,'Scripts_Plots')
    QLMTCONVERT = os.path.join(SOURCE,'qlmtconvertf')
    qargs = [QLMTCONVERT,'qlmt']
    #CALLING PROGRAM
    subprocess.Popen(qargs, stdout=subprocess.PIPE).communicate(input=None)

正しく機能させるには、Pythonスクリプト中に作成した「qlmt」ファイルも閉じる必要がありました。また、「qlmt」ファイルを含むディレクトリで作業しています。

編集サブプロセスの最後にも追加されまし.communicate(input=None)た。これはこのプロセス呼び出しには不要ですが、プロセスが作成しているファイルを使用しようとしたスクリプトで作成した後者の場合は重要でした。私の理解.communicateから、処理し、基本的に次のpython行が実行される前に終了するのを待ちます。に似て.wait()いますが、より高度です。これをより理解している人が詳しく説明したい場合は、遠慮なく編集してください。編集

このメソッドが機能した理由は正確にはわかりませんが、サブプロセスの入力として文字列を使用するとエラーが発生していました。誰かがこれについて何か洞察を持っているなら、あなたがあなたの知識を伝えることができれば私は非常にありがたいです。皆さん、助けてくれてありがとう。

4

1 に答える 1

3

ファイル名のスラッシュを忘れたと思います。

"{0}{1}".format(SOURCE,"qlmtconvertf qlmt") == '/home/myusername/lapw/Sourceqlmtconvertf qlmt'

私はあなたがこれを意味すると思いますか?

"{0}/{1}".format(SOURCE,"qlmtconvertf qlmt") == '/home/myusername/lapw/Source/qlmtconvertf qlmt'

os.path.joinパス名の作成には、直接文字列を作成するのではなく、使用することをお勧めします。

import os.path

executable = os.path.join(SOURCE, 'qlmtconvertf')
args = ['qlmt']

subprocess.Popen(executable+args, stdout=subprocess.PIPE)
于 2012-05-18T17:17:14.803 に答える