【问题标题】:Using subprocess to call R from Python, want to keep STDOUT and ignore STDERR使用子进程从 Python 调用 R,想要保留 STDOUT 并忽略 STDERR
【发布时间】:2015-04-20 19:56:11
【问题描述】:

因此,我目前在 Python 中的这段代码可以在变量“run”中返回我的 STDOUT:

run = subprocess.check_output(['Rscript','runData.R',meth,expr,norm])

但它仍然会在屏幕上打印所有这些丑陋的文本,因为必须在 R 等中安装一个包等等。所以我希望它被忽略并发送到 STDERR。有没有办法做到这一点?这是我目前正在做的,但它似乎不起作用。同样,我只是希望它忽略它在屏幕上打印的内容,除了结果。所以我想忽略STDERR并保留STDOUT。谢谢!

run = subprocess.Popen(['Rscript','runData.R',meth,expr,norm],shell=False,   stdout=subprocess.PIPE,stderr=devnull)

【问题讨论】:

    标签: python subprocess stdout popen stderr


    【解决方案1】:

    为避免完全使用管道 stderr,您可以将其重定向到 os.devnull:

    os.devnull

    空设备的文件路径。例如:'/dev/null' 用于 POSIX,'nul' 用于 Windows。也可以通过 os.path 获得。

    import os
    import subprocess
    with open(os.devnull) as devnull:
        subprocess.Popen([cmd arg], stdout=subprocess.PIPE, stderr=devnull)
    

    【讨论】:

      【解决方案2】:

      我一发布这个问题就解决了我的问题!我很抱歉!它是这样工作的:

       output = subprocess.Popen(['Rscript','runData.R',meth,expr,norm],shell=False, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
      
       final = output.stdout.read()
      

      这忽略了命令行中的杂乱内容并将我的结果保存到最终结果中。

      感谢大家的快速回复!

      【讨论】:

      • 这不是一个好的解决方案。如果 stderr 填满,则子进程挂起。 final, err = output.communicate() 会更好。
      猜你喜欢
      • 2015-10-28
      • 2013-08-26
      • 2023-04-06
      • 1970-01-01
      • 2015-09-13
      • 2011-07-07
      相关资源
      最近更新 更多