2013-02-12 56 views
0

我有什麼似乎是一個簡單的用例:我啓動一個腳本(python或bash),它從命令提示符運行一個模擬器,然後模擬器獲取命令,直到我鍵入ctrl -c或退出。我想在shell中做同樣的事情,下面的代碼不起作用。我正在嘗試做的是測試自動化,所以我想直接從命令行程序嚮應用程序發出命令。在Python中,我有以下幾點:發出連接到shell腳本的終端命令

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'時,我進入輸入模式,並且我的密鑰條目被髮送到應用程序外殼(YCTV-SIM.sh讀取原始輸入),所以理想情況下,我將能夠管道文本直接到這個應用程序shell。到目前爲止,沒有任何反應。測試輸出到控制檯窗口,但應用程序不響應我嘗試發出的命令。我正在使用python 2.6.3,如果這很重要,但Python不是必需的。

語言在這一點上是非常重要的,所以PERL,Python,Bash,TCL ......無論你可以提供什麼幫助。

+0

你不應該用'shell = True'運行它。然後,你的'print'不會進入stdin進程,而是你的父進程標準輸出。 – Keith 2013-02-12 01:50:46

回答

1

您需要重定向子進程的stdin並寫入它。見例如subprocess.Popen.communicate

+0

所以我試過如下: p2.communicate( '/部件1') p2.communicate( '/鍵進入') 這產生了以下錯誤: ... 文件「/ usr/lib中/ python2 .6/subprocess.py「,行701,在溝通 return self._communicate(input) 文件」/usr/lib/python2.6/subprocess.py「,行1226,在_communicate self.stderr.close ) ... 回溯(最近通話最後一個): 文件 「test3.py」 17行,在 p2.communicate( '/鍵進入') 文件「/usr/lib/python2.6/ subprocess.py「,行690,在溝通 self.stdin.write(input) – 2013-02-12 01:57:38

+0

@MickeyKawick我沒有看到實際的異常文本 – wRAR 2013-02-12 02:02:44

+0

很難說,但看起來像這樣的錯誤: GLib-CRITICAL **:g_io_channel_write_chars:assertion'channel-> is_writeable'失敗 – 2013-02-12 02:07:31