似乎无法通过python正确运行fortran可执行文件

时间:2012-05-18 17:05:09

标签: python fortran subprocess os.system

我在SO和其他网站上阅读了很多不同的主题,无法直接回答我的问题/问题。目前我有这个完全运行的python脚本,除了没有调用运行fortran程序正常工作。我尝试过使用子进程命令,os.system命令,打开通过python打开的bash脚本文件,没有运气。以下是我收到的一些示例和错误。

一个亮点:

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"))

这给出了与第一个示例等效的错误。在所有示例SOURCE =“/ home / myusername / lapw / Source /”,其中fortran源文件是,SCRIPTS =“/ home / myusername / lapw / Scripts_Plots /”,其中我有其他文件和python脚本,qlmtconvertf是一个编译好的fortran程序,qlmt是qlmtconvertf读取的文件。如果我在shell中调用它,这个源代码完全正常,就像我已经做过无数次,但我正在尝试自动调用这些代码。我也编写了一个bash脚本,它可以满足我的需求,但我正在尝试通过python来完成所有工作。任何想法,建议或答案我正在做错误和正在发生的事情将不胜感激。提前谢谢大家。

编辑:我得到了弗朗西斯给出的建议。我必须保留完整的路径(即/ home / username / etc)和os.path.join以正确调用程序。

    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(),但更高级。如果有人谁更了解这个想要详细说明,请随意。编辑

我不确定为什么这个方法有效,但是使用字符串作为子进程的输入会产生错误。如果有人对此有任何见解,我将非常感谢你能否传授你的知识。谢谢大家的帮助。

1 个答案:

答案 0 :(得分: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)