繁体   English   中英

使用python在交互式openbash中运行命令

[英]run command in interactive opend bash with python

我使用此脚本运行交互式VLC bash:

import os
import sys
if len(sys.argv) > 1:
       tmp = os.popen('vlc -I rc --novideo --noaudio --rc-fake-tty -q  udp://@1.2.3.4:1234').read()
else :
       print "Error: no input"

现在在这个bash open中,我想运行'info'命令,该怎么做?

如果用bash输入

  vlc -I rc --novideo --noaudio --rc-fake-tty -q  udp://@1.2.3.4:1234

它显示了这一点

VLC media player 2.0.8 Twoflower (revision 2.0.8a-0-g68cf50b)
VLC media player 2.0.8 Twoflower
Command Line Interface initialized. Type `help' for help.
>

然后等待获得命令。

可以使用纯管道完成此操作,但这将非常困难。 甚至难以如果你使用os.popen()而不是使用subprocess

编写交互式程序脚本的正确方法是使用更易于使用的高级库,例如pexpect 然后,您只需编写如下内容:

import pexpect
child = pexpect.spawn('vlc -I rc --novideo --noaudio --rc-fake-tty -q  udp://@1.2.3.4:1234')
child.expect('>')
child.sendline('info')
response = child.before

但是,更好的解决方案是不以交互方式运行VLC;而是以VLC方式运行VLC。 只需以批处理模式运行它并传递命令即可。 尽力让它将您的输入作为TTY对待,以便您可以尝试弄清楚如何在TTY上表现得像人一样,这无缘无故使事情变得更加困难。

或者,甚至更好的是,使用libVLC代替。 从该链接可以看到,有Python绑定。


如果您真的想以交互方式进行操作,并且希望通过管道手动进行操作,则必须非常小心。 如果您不介意在任何意外结果上陷入僵局,则可以执行以下操作:

import subprocess
child = subprocess.Popen(['vlc', '-I', 'rc', '--novideo', '--noaudio',
                          '--rc-fake-tty', '-q', 'udp://@1.2.3.4:1234'],
                         stdin=PIPE, stdout=PIPE)
def split_on_prompts():
    rbuf = ''
    while True:
        newbuf = child.stdout.read()
        rbuf += newbuf
        out, prompt, rest = rbuf.partition('\n>')
        if prompt:
            yield out
            rbuf = rest
        if not newbuf:
            yield rest
            return
output = split_on_prompts()
banner = next(output)
child.stdin.write('info\n')
response = next(output)
# etc.

如您所见,这没那么有趣了。


而且,即使您不赞成使用os.open即使已弃用并且使用起来更加痛苦),如果您以默认的'r'模式打开管道,也显然无法写入它,就像其他任何类似文件的对象一样,当然.read()意味着您甚至再也没有popen对象,您只存储了它给您的第一个缓冲区,然后泄漏了句柄。 如果你改变,要打开'r+'模式下,如果你的平台上工作,以及存储popen对象本身,你同样可以用它来subprocess.Popen上述目的,使用child.writechild.read代替child.stdin.write and child.stdout.read`。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM