简体   繁体   中英

Python Global variable modification does not work

I am trying to update a global variable AUTHEN which refers to the socket's inputstream.

In the run() method, I am trying to modify the AUTHEN's value. However, it never changes when I actually run the program. I am sure my server is did send other message other than "something"

import threading
import sys
import time
import socket
import ssl

AUTHEN ="Something"
class timer(threading.Thread):

    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ssl_sock = ssl.wrap_socket(self.sock, ssl_version=ssl.PROTOCOL_SSLv23)
        self.ssl_sock.connect(('localhost',9991))
        self.isrun = True
        threading.Thread.__init__(self)


    def send(self,str):
        self.ssl_sock.send(str + "\n")


    def run(self):
        global AUTHEN
        while self.isrun:
            receive = self.ssl_sock.recv(1024)
            AUTHEN = receive
            print("recv ->" +AUTHEN)
        self.sock.close()
        self.ssl_sock.close()


    def close(self):
        self.isrun == False


    def authentication(self,username,password):
        global AUTHEN
        print "Verifing identity"
        self.ssl_sock.send("U&P"+"sprt"+username+"sprt"+password+'\n')
        while (True):
            print AUTHEN
            if(AUTHEN == str("OK\r\n")):
                return AUTHEN   
            else:   
                print "Please Try again"
                break   

def main():
    client = timer()
    client.start()

#LOG IN 
while(True):
    loginMessage = str(raw_input("Please enter username and password as following format: \n username%password \n"))
    username = loginMessage.split("%")[0]
    password = loginMessage.split("%")[1]
    Result = client.authentication(username,password)
    if(Result == str("OK\r\n")):
        print "LOG IN SUCCESSFULLY"
        print "Welcome:\n","Command to be used:\n","-a filename\n" "-c number\n", "-f filename\n","-h hostname:port\n","-n name\n","-u certificate\n","-v filename certificate\n","otherwise input will be treated as normal message"
        break
if __name__=='__main__':
main()

Thank you.

You need to call main()

You need to Start() your thread in order to initialize Run() which will set your global variable. Your thread.start() is in your main() def.

import threading

class ThreadClass(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global a
        a = 'Test'
    def main(self):
        thread = ThreadClass()
        thread.start()

a= 'funny'
print a

ThreadClass().main()
print a


>>>funny
>>>Test

尝试从代码中删除两个句子:

global AUTHEN;

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