Skip to main content
 首页 » 编程设计

python之类/函数全局变量没有在 Python 中返回

2025年05月04日8powertoolsteam

我试图从 Python 函数内部提取变量的值,但遇到了一些麻烦。

uri = None 
clientHostname = None 
clientIP = None 
... 
# Handles requests 
class DataHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def do_HEAD(dServe): 
        dServe.send_response(200) 
        dServe.send_header("connection-type", "text/html") 
        dServe.end_headers() 
    def do_GET(dServe): 
        global uri 
        dServe.send_response(200) 
        dServe.send_header("connection-type", "text/html") 
        uri = dServe.path 
        dServe.end_headers() 
        clientHostname = dServe.address_string() 
        clientIP = dServe.connection.getsockname()[0] 
    print(uri) 
    print(clientHostname) 
    print(clientIP) 

当我尝试执行此操作时,它们只返回值“无”。任何指针?这是我对 Python(2.7) 的第一次尝试,我仍在攀登它的钟形曲线。

我的完整脚本目前是:

import time 
import BaseHTTPServer 
import StringIO 
import csv 
import sqlite3 as sql 
import SimpleHTTPServer 
import SocketServer 
import multiprocessing 
import os 
 
 
# Initial Variables 
appsTable = "Apps" 
groupsTable = "Groups" 
hostName = 'localhost' 
dataPort = 277 
filePort = 438 
dbFile = "Get-App.db" 
uri = None 
    clientHostname = None 
    clientIP = None 
if os.name == "nt": 
    dbPath = "Dependencies\sqlite3" 
else: 
    dbPath = "Dependencies/sqlite3" 
 
# Checks for DB and creates if not found 
if os.path.exists(dbFile): 
    print("Database found!") 
else: 
    print("Creating New Database...") 
    os.system("echo .tables | " + dbPath + " " + dbFile) 
    sqlConnect = None 
    try: 
        sqlConnect = sql.connect(dbFile) 
        sqlCursor = sqlConnect.cursor() 
        sqlCursor.execute('CREATE TABLE ' + appsTable + '(ID INTEGER PRIMARY KEY ASC, Name TEXT, InstallGroup TEXT, Version TEXT, Arch TEXT, Executable TEXT, Path TEXT, Command TEXT, Latest BOOL, Enabled BOOL)') 
        sqlCursor.execute('CREATE TABLE ' + groupsTable + '(ID INTEGER PRIMARY KEY ASC, Name TEXT, AppList TEXT, Version TEXT, Arch TEXT, Latest BOOL, Enabled BOOL)') 
    finally: 
        if sqlConnect: 
            sqlConnect.close 
 
# Serves files 
def file_serve(): 
    if not os.path.exists(dbFile): 
        os.makedirs(appsTable) 
    os.chdir(appsTable) 
    FileHandler = SimpleHTTPServer.SimpleHTTPRequestHandler 
    fileServer = SocketServer.TCPServer(("", filePort), FileHandler) 
    fileServer.serve_forever() 
 
# Handles requests 
class DataHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def do_HEAD(dServe): 
        dServe.send_response(200) 
        dServe.send_header("connection-type", "text/html") 
        dServe.end_headers() 
    def do_GET(dServe): 
        global uri 
        dServe.send_response(200) 
        dServe.send_header("connection-type", "text/html") 
        uri = dServe.path 
        dServe.end_headers() 
        clientHostname = dServe.address_string() 
        clientIP = dServe.connection.getsockname()[0] 
        dServe.wfile.write(uri) 
    print(uri) 
    print(clientHostname) 
    print(clientIP) 
 
 
    # This is what's written to the page: 
    uriPar = csv.reader(uri, delimiter='?') 
    uriEnt = csv.reader(uriPar[0], delimiter='/') 
    sqlConnect = sql.connect(dbFile) 
    for entity in uriEnt: 
        with sqlConnect:     
            sqlCursor = sqlConnect.cursor() 
                if entity[1] == "app": 
                    if len(entity) == 3: 
                        print clientHostname + " made request for app " + entity[2] 
                        sqlCursor.execute("SELECT Executable,Path,Command FROM " + appsTable + " WHERE Latest='true' AND Enabled='true' AND Name='" + entity[2] + "'") 
                    else: 
                        print clientHostname + " made request for app " + entity[2] + ", specifically version " + entity[3] 
                        sqlCursor.execute("SELECT Executable,Path,Command FROM " + appsTable + " WHERE Enabled='true' AND Version='" + entity[3] + "' AND Name='" + entity[2] + "'") 
                elif entity[1] == "group": 
                    if len(entity) == 3: 
                        print clientHostname + " made request for group " + entity[2] 
                        sqlCursor.execute("SELECT AppList FROM " + groupsTable + " WHERE Latest='true' AND Enabled='true' AND Name='" + entity[2] + "'") 
                    else: 
                        print clientHostname + " made request for group " + entity[2] + ", specifically version " + entity[3] 
                        sqlCursor.execute("SELECT AppList FROM " + groupsTable + " WHERE Enabled='true' AND Version='" + entity[3] + "' AND Name='" + entity[2] + "'") 
    rows = sqlCursor.fetchall() 
    for place in rows: 
        for position in place: 
            dServe.wfile.write(position) 
            dServe.wfile.write(",") 
 
# Serves http 
if __name__ == '__main__': 
    dataServer_class = BaseHTTPServer.HTTPServer 
    dataServer = dataServer_class((hostName, dataPort), DataHandler) 
    print time.asctime(), "Data Service Starts - %s:%s" % (hostName, dataPort) 
    print time.asctime(), "File Service Starts - %s:%s" % (hostName, filePort) 
    try: 
    fileServerThread = multiprocessing.Process(target=file_serve)  
    fileServerThread.start()  # Starts File Server 
        dataServer.serve_forever()  # Starts HTTP Server 
    except KeyboardInterrupt: 
        pass 
    dataServer.server_close() 
    fileServer.server_close() 
    print time.asctime(), "Server Stops - %s:%s" % (hostName, dataPort) 

请您参考如下方法:

首先,代码中的所有 print 语句都是在加载类定义时执行的,这可能不是您真正想要的。

其次,如果这是完整的代码,您永远不会构建和启动您的 HTTP 服务器实例。您或多或少需要这样的代码,它实例化并启动服务器对象:

if __name__ == '__main__': 
    httpd = BaseHTTPServer.HTTPServer((HOST_NAME, PORT_NUMBER), DataHandler) 
    try: 
        httpd.serve_forever() 
    except KeyboardInterrupt: 
        pass 
    httpd.server_close() 

此外,以这种方式使用全局变量不是一个好主意 - 例如,如果您的服务器同时接受许多连接怎么办?

如果您是 Python 的新手,我建议您开始使用现有的工作代码,例如this sample .

编辑:您的部分代码似乎缩进不正确。看下面的例子:

class Test(object): 
 
    def run(self): 
        print 1 
    print 2 
 
# By this time, '2' is already printed! 
print 3 
t = Test() 
t.run() 

它打印出:

2 
3 
1 

你的代码中也发生了同样的事情 - print 语句,它后面的代码缩进了 4 个空格,所以它会在类被解析时运行(嗯,不完全是,简化一个位)。