3

我运行一个以“命令”模式运行软件的子进程。(这个软件是 The Foundy 的 Nuke,如果你知道那个软件的话)

在命令模式下,该软件正在等待用户输入。此模式允许在没有任何 UI 的情况下创建合成脚本。

我已经完成了启动进程的这段代码,找到应用程序何时启动,然后我尝试向进程发送一些命令,但标准输入似乎没有正确发送命令。

这是我为测试此过程所做的示例代码。

import subprocess

appPath = '/Applications/Nuke6.3v3/Nuke6.3v3.app/Nuke6.3v3' readyForCommand = False

commandAndArgs = [appPath, '-V', '-t'] 
commandAndArgs = ' '.join(commandAndArgs) 
process = subprocess.Popen(commandAndArgs, 
                           stdin=subprocess.PIPE, 
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.STDOUT, 
                           shell=True, )

while True:
    if readyForCommand:
        print 'trying to send command to nuke...'
        process.stdin.write('import nuke')
        process.stdin.write('print nuke')
        process.stdin.write('quit()')
        print 'done sending commands'
        readyForCommand = False
    else:
        print 'Reading stdout ...'
        outLine = process.stdout.readline().rstrip()
        if outLine:
            print 'stdout:', outLine

            if outLine.endswith('getenv.tcl'):
                print 'setting ready for command'
                readyForCommand = True

    if outLine == '' and process.poll() != None:
        print 'in break!'
        break

print('return code: %d' % process.returncode) 

当我在 shell 中运行 nuke 并发送相同的命令时,我得到的是:

sylvain.berger core/$ nuke -V -t
[...]
Loading /Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/getenv.tcl
>>> import nuke
>>> print nuke
<module 'nuke' from '/Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/nuke/__init__.pyc'>
>>> quit()
sylvain.berger core/$ 

知道为什么标准输入没有正确发送命令吗?谢谢

4

2 回答 2

3

您的代码将发送文本

import nukeprint nukequit()

没有换行符,因此 python 实例不会尝试执行任何东西,一切都只是坐在缓冲区中等待换行符

于 2012-04-30T00:31:22.493 回答
0

subprocess模块不适用于与进程的交互式通信。充其量,你可以给它一个预先计算好的标准输入字符串,然后读取它的标准输出和标准错误:

p = Popen(..., stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(predefined_stdin)

如果您确实需要交互,请考虑使用pexpect

于 2012-04-30T00:31:29.250 回答