0

Autodesk Maya 2012 は、「mayapy」を提供します。これは、Maya ファイルをロードし、バッチ作業用のヘッドレス 3D エディタとして機能するために必要なパッケージで満たされた Python の modded ビルドです。私はbashスクリプトから呼び出しています。そのスクリプトが でシーン ファイルを開くとcmds.file(filepath, open=True)、警告、エラー、その他の不要な情報のページが表示されます。cmds.file コマンドの実行中にのみ、すべてをオフにしたいと考えています。

シェル スクリプト内で mayapy に送信している Python コマンド内からリダイレクトしようとしましたが、うまくいきません。bash スクリプトの呼び出しで stdout/err を /dev/null にリダイレクトすることで、すべてを黙らせることができます。シェルへの呼び出しでそれを黙らせる方法はありますが、スクリプト内で渡されたコマンドが情報を出力できるようにしますか?

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
4

2 に答える 2

2

基本的に、これを解決する最善の方法は、test.shを実行し、シェルへの出力をサニタイズするラッパーを実装することだと思います。出力をサニタイズするには、文字列を追加して、このテキストが出力に適していることをラッパーに通知します。ラッパーファイルの私のインスピレーションはこれから来ました: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呼び出しをサブプロセスでラップしているため、通常シェルに表示されるすべての出力がキャプチャされ、不要な行をインターセプトする必要があります。

もちろん、Pythonスクリプトからtest.shを呼び出すには、正しい権限があることを確認する必要があります。

于 2013-02-02T08:40:11.873 に答える
0

私は自分がパイプでねじれていることを知っていました。実際、Maya はすべてのバッチ出力を 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
于 2013-02-06T00:57:52.740 に答える