【问题标题】:Executing shell command from python从python执行shell命令
【发布时间】:2013-08-25 18:50:21
【问题描述】:

我正在尝试编译一组行并执行它们并将输出附加到文本文件中。我没有写同样的东西,而是使用python脚本在后台编译和执行。

import subprocess
subprocess.call(["ifort","-openmp","mod1.f90","mod2.f90","pgm.f90","-o","op.o"])
subprocess.call(["nohup","./op.o",">","myout.txt","&"])

程序pgm.f90 正在使用ifort 编译器编译,但输出没有附加到myout.txt。相反,它会将输出附加到nohup.out,并且即使在 python 脚本中指定"&" 之后,程序也在后台运行。

我在这里犯了什么明显的错误?

提前致谢

【问题讨论】:

    标签: python append subprocess


    【解决方案1】:

    您可以通过使用 Popen() 和参数 shell=True 来调用子进程,就像在 shell 中一样:

    subprocess.Popen("nohup ./op.o > myout.txt &", shell=True)
    

    【讨论】:

      【解决方案2】:

      这个问题是,当您将参数作为元素列表提供时,子进程库会绕过 shell 并使用 exec 系统调用直接运行您的程序(在您的情况下为“nohup”)。因此,不是由 shell 解释 ">" 和 "&" 运算符来重定向输出并在后台运行,而是将它们作为文字参数传递给 nohup 命令。

      你可以告诉 subprocess 通过 shell 执行你的命令,但这会启动一个额外的 shell 实例并且可能是浪费的。解决方法是在子进程中使用内置的重定向功能,而不是使用 shell 原语:

      p = subprocess.Popen(['nohup', "./op.o"],
                           stdout=open('myout.txt', 'w'))
      # process is now running in the background.
      # if you want to wait for it to finish, use:
      p.wait()
      # or investigate p.poll() if you want to check to see if
      # your process is still running.
      

      欲了解更多信息:http://docs.python.org/2/library/subprocess.html

      【讨论】:

      • 我将如何解决这个问题?
      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 2014-01-22
      相关资源
      最近更新 更多