2014-01-29 43 views
0

我試圖使用subprocess,popen,os.spawn來運行一個進程,但好像需要一個僞終端。向psuedo shell發出命令(pty)

import pty 

(master, slave) = pty.openpty() 

os.write(master, "ls -l") 

應該發送「ls -l命令」,以從TTY ......我試圖讀取響應os.read(碩士,1024),但沒有什麼是可用的。

編輯:

還試圖創建的pty的,然後在子打開通話 - 仍然沒有奏效。

import pty 
import subprocess 

(master, slave) = os.openpty() 
p = subprocess.Popen("ls", close_fds=True, shell=slave, stdin=slave, stdout=slave) 

類似:

Send command and exit using python pty pseudo terminal process

How do *nix pseudo-terminals work ? What's the master/slave channel?

+0

你不需要一個pty來運行'ls'。一根管子就能很好地工作。你在那裏嘗試了什麼? – Keith

+1

我使用'ls'來測試功能。 – user791953

+0

在您的編輯中,您正在混合pty和管道。不要這樣做。使用一個或另一個。 – Keith

回答

2

使用pty.spawn而不是os.spawn。這裏有一個函數在一個單獨的pty中運行一個命令,並以字符串的形式返回它的輸出:

import os 
import pty 

def inpty(argv): 
    output = [] 
    def reader(fd): 
    c = os.read(fd, 1024) 
    while c: 
     output.append(c) 
     c = os.read(fd, 1024) 

    pty.spawn(argv, master_read=reader) 
    return ''.join(output) 

print "Command output: " + inpty(["ls", "-l"])