【问题标题】:how can I silence all of the output from a particular python command?如何使特定 python 命令的所有输出静音?
【发布时间】:2013-01-17 13:23:56
【问题描述】:

Autodesk Maya 2012 提供了“mayapy”——一个修改过的 python 构建,其中包含加载 Maya 文件所需的包,并充当批处理工作的无头 3D 编辑器。我从 bash 脚本中调用它。如果该脚本在其中打开带有cmds.file(filepath, open=True) 的场景文件,它会喷出一页页的警告、错误和其他我不想要的信息。我想在 cmds.file 命令运行时关闭所有这些。only

我尝试从我发送的 Python 命令内部重定向到 shell 脚本中的 mayapy,但这不起作用。我可以通过在对 bash 脚本的调用中将 stdout/err 重定向到 /dev/null 来使所有内容静音。有什么方法可以在调用 shell 时使其静音,但仍然允许我在脚本中传入的命令打印出信息?

test.sh:

#!/bin/bash

/usr/autodesk/maya/bin/mayapy -c "
cmds.file('filepath', open=True);
print 'hello'
"

调用它:

$ ./test.sh                  # spews info, then prints 'hello'
$ ./test.sh > /dev/null 2>&1 # completely silent

【问题讨论】:

  • 我看到您尝试将 sys.stdout/err 指向死写方法,但您是否也尝试将 sys.__stdout__ 和 sys.__stderr__ 指向死写方法?它们通常指向 stdout 和 stderr 的原始值,也许 mayapy 将这些值用于打印方法而不是典型的方法?
  • 我只是试了一下,但它仍然会打印出所有额外的信息。
  • 作为健全性检查:我正在做sys.stdout = open('/dev/null','w'),stderr 也是如此,你的两个值带有下划线。
  • 我是否正确地假设 mayapy 正在生成这些消息并将它们传播到调用 bash 脚本,而这实际上是打印出来的?看起来是这样,因为我可以在 bash 级别停止它。
  • 他们当然有可能向上传播消息,但更有可能的是他们将消息一起打印到其他地方而不是传播到 python 层。您打算记录多少属于您的内容,因为我正在考虑一种可行的解决方法。

标签: python stdout output maya


【解决方案1】:

基本上,我认为解决此问题的最佳方法是实现一个包装器,该包装器将执行 test.sh 并清理到 shell 的输出。为了清理输出,我会简单地添加一些字符串来通知您的包装器该文本适合输出。我对包装文件的灵感来自于:https://stackoverflow.com/a/4760274/2030274

内容如下:

import subprocess

def runProcess(exe):
    p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while(True):
      retcode = p.poll() #returns None while subprocess is running
      line = p.stdout.readline()
      yield line
      if(retcode is not None):
        break

for line in runProcess(['./test.sh']):
  if line.startswith('GARYFIXLER:'):
      print line,

现在您可以想象 test.sh 类似于

#!/bin/bash

/usr/autodesk/maya/bin/mayapy -c "
cmds.file('filepath', open=True);
print 'GARYFIXLER:hello'
"

这只会打印 hello 行。由于我们将 python 调用包装在一个子进程中,因此通常显示给 shell 的所有输出都应该被捕获,并且您应该截取不需要的行。

当然,要从 python 脚本调用 test.sh,您需要确保您拥有正确的权限。

【讨论】:

  • 啊,当然是过滤!它工作得很好。感谢您的帮助。
【解决方案2】:

我知道我只是被管道扭曲了。 Maya 确实将 all 批处理输出发送到 stderror。一旦您正确地管道 stderr,这将完全释放 stdout。这是一个有效的全 bash 单行代码。

# load file in batch; divert Maya's output to /dev/null
# then print listing of things in file with cmds.ls()
/usr/autodesk/maya/bin/mayapy -c "import maya.standalone;maya.standalone.initialize(name='python');cmds.file('mayafile.ma', open=True);print cmds.ls()" 2>/dev/null

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2018-10-26
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多