2

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

我不确定为什么这种方法有效,但是使用字符串作为子进程的输入会出错。如果有人对此有任何见解,如果您能传授您的知识,我将不胜感激。谢谢大家的帮助。

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 回答