【问题标题】:Issue terminal commands that are piped to a shell script发出通过管道传送到 shell 脚本的终端命令
【发布时间】:2013-01-27 06:11:18
【问题描述】:

我有一个看似简单的用例:我启动一个脚本(python 或 bash),它从命令提示符运行模拟器,然后模拟器接受命令,直到我键入 ctrl-c 或退出。我想从 shell 做同样的事情,我下面的代码不起作用。我想做的是测试自动化,所以我想从命令外壳直接向应用程序发出命令。在python中,我有以下内容:

    import os 
    import subprocess

    command = ['/usr/local/bin/YCTV-SIM.sh', '-Latest'] #emulator for yahoo widgets
    process = subprocess.Popen( command, shell=True, stdin=subprocess.PIPE )

    time.sleep(12) #wait for launch to finish
    print '/widgets 1' #first command to issue
    print '/key enter' #second command to issue

    process.wait()

如您所见,这是一些非常简单的东西。当从命令 shell 启动“YCTV-SIM.sh”时,我进入输入模式,我的键条目被发送到应用程序 shell(YCTV-SIM.sh 读取原始输入),所以理想情况下,我能够将文本直接传送到此应用程序外壳。到目前为止,什么都没有发生;测试输出到控制台窗口,但应用程序不响应我尝试发出的命令。我正在使用 python 2.6.3,如果这很重要,但不需要 Python ..

语言在这一点上并不重要,因此 PERL、Python、Bash、TCL...任何你能提出的建议都可能会有所帮助。

【问题讨论】:

  • 您不应该使用shell=True 运行它。那么,你的print 不会进入进程stdin,而是你的父进程stdout。

标签: python bash shell subprocess pipe


【解决方案1】:

您需要重定向子进程的stdin 并写入。参见例如subprocess.Popen.communicate.

【讨论】:

  • 所以我尝试了以下操作: p2.communicate( '/widgets 1' ) p2.communicate( '/key enter' ) 这产生了以下错误: ... File "/usr/lib/ python2.6/subprocess.py”,第 701 行,在通信中返回 self._communicate(input) 文件“/usr/lib/python2.6/subprocess.py”,第 1226 行,在 _communicate self.stderr.close() 中。 .. Traceback(最近一次调用最后一次):文件“test3.py”,第 17 行,在 p2.communicate('/key enter') 文件“/usr/lib/python2.6/subprocess.py”中,第 690 行,在通信 self.stdin.write(input)
  • @MickeyKawick 我没有看到实际的异常文本
  • 很难说,但这看起来像错误:GLib-CRITICAL **: g_io_channel_write_chars: assertion `channel->is_writeable' failed
  • 这是新代码:process.communicate('/widgets 1')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多