2016-12-21 2 views
0

サブプロセスの出力を取得してログインを求め、残りのスクリプトを続けてログインしようとしていますが、しかし、私のユーザー名とパスワードを入力した後、私は次のエラーを取得する:Python3のログインシェルコマンドを使用したリアルタイム出力

以下
Traceback (most recent call last): 
    File "./login.py", line 20, in <module> 
    login() 
    File "./login.py", line 13, in login 
    output = login_cmd.stderr.read(1) 
ValueError: read of closed file. 

はスクリプトです:。

import subprocess, sys 

raidcom = '/usr/bin/raidcom' 

def login(cmd=raidcom): 
    login_cmd = subprocess.Popen('{cmd} -login'.format(cmd=cmd), 
           stderr=subprocess.PIPE, shell=True) 
    (output, err) = login_cmd.communicate() 
    while True: 
     output = login_cmd.stderr.read(1) 
     if output == '' and login_cmd.poll() != None: 
      break 
     if output != '': 
      sys.stdout.write(output) 
      sys.stdout.flush() 

login() 

私は通常、それがログイン後に何も返さないシェルからコマンドを実行すると

+0

['Popen.communicate':プロセスとの対話:データをstdinに送ります。ファイルの終わりに達するまで、stdoutとstderrからデータを読み込みます。 **プロセスが終了するのを待つ**](https://docs.python.org/3.5/library/subprocess.html#subprocess.Popen.communicate) – jwodder

+0

'output'はプロセスがstdoutに書き込んだものですあなたがstdoutをリダイレクトしていないので空でなければなりません。 'err'は' stderr'に書いたものです。 'shell = True'を避け、代わりに' subprocess.Popen([cmd、 '-login']、stderr = subprocess.PIPE)を ' –

答えて

0

私はこの状況のまわりで別の方法を見つけました。リアルタイム出力を渡すのではなく、ユーザーのユーザー名とパスワードの情報を入力し、その情報をコマンドに挿入しました。以下の関数は動作します:

import subprocess 
import getpass 

raidcom = '/usr/bin/raidcom' 

def raidcom_login(cmd=raidcom): 
    """Login to CCI and return its output.""" 
    horcm_user = input("Please enter your username for logging into CCI: ") 
    horcm_pass = getpass.getpass("Please enter your password: ") 
    try: 
     login_cmd = subprocess.check_output('{cmd} -login {} {}'.format(horcm_user, horcm_pass, cmd=cmd), 
           stderr=subprocess.PIPE, shell=True) 
    except subprocess.CalledProcessError: 
     print('Login failed') 
関連する問題