[Python] Hilo general

Taiden

#1227 gracias, les echaré un ojo!

Pizzelio

Gente una dudilla, estoy haciendo una api usando sqlalchemy y quiero que cuando intenten actualizar un registro no tenga que comprobar qué campo/s quieren actualizar sino que lo detecte solo. Estoy intentando esto:

def update_tipo_contratos(id_tipo_contratos):
    data = request.get_json()
    tipo_contrato = TblTipoContratos.query.get(id_tipo_contratos)
   
for k in data.keys(): tipo_contrato.k = data[k] #...

El problema es que tipo_contrato.k no accede al campo que yo quiero porque no coge el valor de k y como es un query object no puedo hacer tampoco tipo_contrato[k]

Alguna idea? Gracias

stuckED

Alguien de aquí se ha pegado con RabbitMQ y conexiones mediante SSL? Estoy en un callejón sin salida y me estoy pensando tirar el ordenador por la ventana

MartiONE
1 1 respuesta
Kalgator

#1234 Le ha durado poco la jubilación

Fyn4r

Casi lo prefería en su casa

1
eisenfaust

Pues malas noticias. Guido siempre ha sido un lastre.

1
Pizzelio

Una dudilla, me piden hacer un código en python que esté completo y listo para ejecutar en un arm de 1 core y 256 de ram.

El programa ya prácticamente lo tengo pero me falta esa parte que no sé ni como empezarla y decidir de qué manera almacenar la información (tiene que ser persistente) que lo he dejado un poco de lado porque imagino que tendrá relación con el arm.

Alguna idea?
Gracias!

1 respuesta
eondev

#1238 no te entiendo. Lo que te queda es la parte de la persistencia dices? Sobre qué SO se ejecuta, Linux?

1 respuesta
Pizzelio

#1239 Sí, linux. Me queda saber como tengo que adaptar el código para que funcione en una máquina de ese estilo y la persistencia. Solo tengo que almacenar cadenas de texto cortas pero no sé qué soporte sería el más óptimo.

2 respuestas
HeXaN

#1240 Ahora mismo no veo la dificultad pero yo tiraría por un fichero de texto plano (CSV), un SQLite o algo así.

2 1 respuesta
eondev

#1240 a ver, con esa memoria y cpu la verdad no veo problema alguno. Si fuese un sistema embebido con 256k y tal pues igual sí que tocaría tirar de micropython o alguna historia así (de no tirar por C, claro).
Con 256 MB puedes hasta meter el DOOM si te da la gana xDD

2 1 respuesta
Pizzelio

#1241 Ayuda a decidir si tengo que controlar que se puede interrumpir la ejecución aleatoriamente y al arrancar de nuevo tiene que recuperar los datos leídos hasta la parada?
#1242 Ah vale, pensaba que tenía que hacer algo en plan configuración o parecido para que funcionase en ese sistema. Mejor entonces

Gracias!

1 respuesta
eondev

#1243 eso ya forma parte de como hayas programado el script para evitar la corrupción de datos y tener persistencia. Utilizar transacciones etc

1
Taiden

#127 funciona genial, justo lo que quería. Muchas gracias!

En general usas más esta librería que Matplotlib? O la usas sólo para hacer gráficos interactivos?

Pizzelio

De qué formas puedo cerrar un server socket? Cuando hago control+C realmente no se para hasta que no intenta acceder otra conexión. Me gustaría algo en plan que cuando está unos segundos sin recibir datos se cerrase o algo así.

1 1 respuesta
eondev

#1246 si lo tienes cerrado, como vas a saber si hay una conexión entrante a ese socket?

1 respuesta
Pizzelio

#1247 a ver es que lo que quiero es hacerle una prueba que este recibiendo y procesando datos pero que al acabar la prueba se cierre y me muestre un resumen de los datos procesados.

Entonces quiero poner alguna forma automática de que se cierre para que muestre ese resumen al finalizar.

2 respuestas
eondev

#1248 Intuyo que quien cierra la conexión es el cliente no? Entonces no veo el problema, cuando el cliente cierra la conexión (close()) recibes 0 bytes, por lo que ahí ya puedes descartar la conexión.

De todas formas, te recomiendo que establezcas un protocolo de comunicación si no lo has hecho ya, donde marques en el primer byte lo que vas a enviar, así como avisando de que vas a cerrar la conexión.

1
Kaiserlau

#1248 No se si te he etendido bien pero si es desde el servidor, en el main loop del server es tan facil como poner try (con tus cosas xd) y luego un except con un KeyboardInterrupt, que es el ctrl+c, en esa excepción pones el socket.close() despues por ejemplo tu función para que tire lo que quieras.

1 1 respuesta
Pizzelio

#1250 a esto me refiero exactamente, el tema es que tengo la excepción keyboardinterrupt pero cuando hago control c no se termina de parar y mostrar las stats sino que tengo que lanzarle otra petición y ya entonces sí.

Igual es porque me falta el socket.close en la excepción, voy a probar.

Thanks

Edit: pues tampoco es por eso :(
Edit2: olvidé comentar que estoy usando selectors para manejar varias conexiones simultáneamente, no sé si tiene algo que ver

2 respuestas
eondev

#1251 creia que el problema lo tenías en el server soz xDDD. Por otra petición dices que debes darle 2 veces al teclado para que salga?

1 respuesta
Pizzelio

#1252 yo tengo el server, hago control c y como si nada. Por muchas veces que le de.

Si hago otra petición, la rechaza y ya sí me muestra las stats.

Es como si se interrumpiera cuando hago control c pero sin mostrarlo hasta que no hay intento de otra petición.

1 respuesta
Kaiserlau

#1251 pues tendras que pegarte un poco con la docu. Sin ver tu codigo no se decirte o que te digan los artistas xd

1
eondev

#1253 pero no entiendo por qué tienes que hacer control c en el server XD.

Es decir, tienes un cliente que envia unos datos al servidor, cuando el cliente termina de enviarte los datos, tu le das a control +c para que cierre la conexión, pero no te hace ni puto caso y hasta que el cliente no te vuevle a intentar enviar algo no salta para hacer el tratamiento de datos que quieres hacer, es así?

Lo que te he dicho antes es que sea el cliente que cuando termine, mande una señal, o cierre él la conexión y que el propio servidor corte al leer EOF (0 bytes). Es que sin ver el código o ando espeso o no te entiendo XD

1 respuesta
Pizzelio

#1255 me explico fatal, perdonad.

A ver, el server está siempre escuchando y abre y cierra conexiones con los clientes como dices pero no se para al terminar con un cliente sino que se queda a la escucha por si entra otro después.

Yo lo que quiero es una forma de pararlo manualmente para que me muestre esas stats totales de todas las conexiones que hubo durante su ejecución.

El código es que no lo tengo a mano ahora, por la noche lo pongo.

2 respuestas
aren-pulid0

Hace mucho que no toco sockets, pero cuando captures la excepción cierralo, saca los resultados y vuelve a abrirlo

desu

#1256 https://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python

Te vale? Si no quieres matar el server pues interceptas esa u otra se;al y solo printas sin el exit.

1
Slowbro

#1256 Solo un apunte, usar with es muy comodo en estos casos para asegurarte que 'cierras la puerta al salir'.

Te copio el ejemplo de la doc para sockets

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
1
Pizzelio

No consigo que me funcione nada de eso, es como que no detecta que he hecho control C, no sé por qué.
Este es mi código

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as lsock:
    lsock.bind((host, port))
    lsock.listen()
    print("listening on", (host, port))
    lsock.setblocking(False)
    sel.register(lsock, selectors.EVENT_READ, data=None)

try:
    while True:
        events = sel.select(timeout=None)
        for key, mask in events:
            if key.data is None:
                accept_wrapper(key.fileobj) #Acepta una conexion
            else:
                service_connection(key, mask) #Recoge lo que envía el cliente
            
except KeyboardInterrupt:
    print("caught keyboard interrupt, exiting")
finally:
    sel.close() #sel es el selector de sockets, el que los gestiona

Creo que esta es la línea que me está jodiendo: events = sel.select(timeout=None), deja el server bloqueado hasta que hay una conexión

EDIT: Era justo eso, hay que poner -1 para que no ponga en block el server. Perdón por el mareo y gracias a todos!

1

Usuarios habituales