如何使特定python命令的所有输出静音?

时间:2013-02-02 07:34:18

标签: python stdout output maya

Autodesk Maya 2012提供了“mayapy” - 一个python的编译版本,其中包含加载Maya文件所需的软件包,并作为批量工作的无头3D编辑器。我是用bash脚本调用的。如果该脚本使用cmds.file(filepath, open=True)在其中打开一个场景文件,它会发出警告,错误和其他我不想要的信息。我想在cmds.file命令运行时将所有这些都关闭

我已经尝试从我在shell脚本中发送到mayapy的Python命令内部重定向,但这不起作用。通过在调用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

2 个答案:

答案 0 :(得分:2)

基本上,我认为解决此问题的最佳方法是实现一个包装器,它将执行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,您需要确保拥有正确的权限。

答案 1 :(得分:0)

我知道我刚刚被管道扭曲了。 Maya确实将所有批量输出发送到stderror。一旦你正确地管道stderr,这将完全释放stdout。这是一个全力以赴的单线工作。

# 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