Soy nuevo en python, actualmente estoy trabajando en un GPS tracker con que interactúa con Google maps usando un Arduino Uno. Estoy recibiendo este error y no me deja ejecutar el .py secuencia de comandos para mi tcpServer este es el guión entero.

#!/usr/bin/env python

import socket
import MySQLdb
TCP_IP = 'my machine IP'
TCP_PORT = 32000
BUFFER_SIZE = 40
# ClearDB. Deletes the entire tracking table
def ClearDB(curs,d ):
curs.execute ("""
INSERT INTO gmaptracker (lat, lon)
VALUES (0.0,0.0)""")
d.commit()
# Connect to the mySQL Database
def tServer():
try:
db = MySQLdb.connect (host = "my host",
user = "my user",
passwd = "my password",
db = "gmap" )
except MySQLdb.Error, e:
print "Error %d: %s" %(e.args[0], e.args[1])
sys.exit(1);
cursor = db.cursor()
# Start with a fresh tracking table
ClearDB(cursor,db)
# Set up listening Socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((TCP_IP, TCP_PORT))
print "Listening...."
s.listen(1)
conn, addr = s.accept()
print 'Accepted connection from address:', addr
except socket.error (message):
if s:
s.close()
print "Could not open socket: " + message
cursor.close()
conn.close()
db.close()
sys.exit(1)
try:
while 1:
data = conn.recv(BUFFER_SIZE)
if not data:break
str1,str2 = data.split("Long: ")
str1 = str1.split("Lat: ")[1]
latitude = float(str1)
longitude = float(str2)
cursor.execute ("""
INSERT INTO gmaptracker (lat, lon)
VALUES (%s,%s)""", (latitude,longitude))
db.commit()
except KeyboardInterrupt:
ClearDB(cursor,db);
cursor.close()
conn.close()
db.close()
if __name__ == '__main__':
tServer()

y este es el error que estoy consiguiendo

Traceback (most recent call last):
File "tcpServer.py", line 79, in <module>
tServer()
File "tcpServer.py", line 48, in tServer
except socket.error(message):
NameError: global name 'message' is not defined

Si alguien me puede ayudar a resolver esto me sería de gran aprecio, como ya he dicho soy nuevo en python también estoy ejecutando python 2.7 si que ayuda. Gracias de antemano

InformationsquelleAutor Jose Manuel | 2013-02-06

1 Comentario

  1. 2

    Usted no está utilizando la sintaxis correcta para la captura de una excepción. En su lugar, utilice:

    except socket.error as serror:
    message = serror.message

    La socket.error excepción tiene dos atributos adicionales, errno y message. Código antiguo utilizado para la captura de esta manera:

    except socket.error, (value, message):

    porque en Python 2 se puede tratar de una excepción como una tupla y descomprimirlo, pero que ha ido en Python 3 y realmente debería no ser utilizado.

    Por otra parte, los mayores except exceptiontype, targetvariable: ha sido sustituido por el except exceptiontype as targetvariable: de la sintaxis, que es menos ambiguo cuando intenta coger más de un tipo de excepción en la misma instrucción.

    Cuando se produce una excepción, el flujo normal de código se interrumpe, sino que el flujo de «saltos» para el controlador de excepciones. Debido a este salto, usted tiene otro problema en el código. En el controlador de excepciones que se refieren a conn.close(), pero la variable conn se define después de el punto donde el zócalo de la excepción será lanzada (las diversas operaciones con conectores). Esto resultará en un NameError. En este caso, no es no hay camino a través de su código que va a resultar en conn se le asigna un abrir el socket de conexión, puede quitar el conn.close() línea por completo.

    Si no fue una necesidad de llamar .close() en conn, sería necesario detectar si fue en el primer lugar. Conjunto a None, de antemano, a continuación, llamar .close() sólo si conn ya no None:

    conn = None
    try:
    # ... do stuff ...
    conn, addr = s.accept()
    # ... do more stuff
    except socket.error as serror:
    # test if `conn` was set
    if conn is not None:
    conn.close()
    • Gracias que ha ayudado, pero ahora estoy haciendo esto: traceback (la mayoría de llamada reciente last): File «tcpServer.py», line80, en <módulo> tServer() File «tcpServer.py», línea 54, en tServer conn.close()
    • Usted está tratando de cerrar conn, pero la socket.error es arrojado antes que se establece la variable.
    • ok, así que esto es lo que yo estoy haciendo ahora [Archivo»tcpServer.py», línea 55, en tServer conn.close()] [unboundLocalError: variable local ‘conn’ hace referencia a antes de la asignación] ¿alguna idea? @Martijn Pieters
    • Eso era lo que yo estaba tratando de explicar, la tarea no se ejecuta. Ampliado la respuesta con una explicación más detallada.
    • Gracias estoy muy frustrado con esto… he estado tratando de solucionar este problema desde hace algún tiempo y no ha tenido nada de suerte, que estaba trabajando bien hace un tiempo y luego se puso hecha un lío y no he sido capaz de averiguar los problemas.

Dejar respuesta

Please enter your comment!
Please enter your name here