Re: [Python-es] ¿Como cierro correctamente un hilo-servidor de sockets?
En la interrupcion KeyboardInterrupt tienes que cerrar los hilos para que no se te quede el mismo en CLOSE_WAIT que en ciertos casos puede durar bastante en liberarse. De todas maneras yo te recomiendo que uses la librería select o asyncore para manejar socket's, intenta evitar cuando puedas sockets y threading El 26 de agosto de 2011 02:21, Sergio Martín escribió: > Comentar que aunque añada la línea: >self.socketserver.close() > en el método close() de la clase TelnetServer el resultado es el mismo. > > El día 26 de agosto de 2011 02:17, Sergio Martín > escribió: > > Tengo un script en el que, primero, ejecuto un servidor de sockets en > > un hilo, y cada conexión que reciba, genera su propio hilo. > > El problema viene cuando intento salirme del programa mediante una > > excepción KeyboardInterrupt controlada, funciona bien si no ha habido > > ninguna conexión al socket-servidor, pero si me salgo del programa una > > vez que he recibido alguna conexión, y, a continuación ejecuto el > > programa de nuevo, me sale un "socket.error: [Errno 48] Address > > already in use", como si no hubiese cerrado el socket del servidor > > correctamente, teniéndome que esperar un rato hasta que se libere el > > puerto. > > Tengo controladas dos situaciones una que desde el cliente telnet se > > pase el comando "quit", con lo que cierro el socket del cliente, y > > otra cuando se pierde la conexión con el cliente sin introducir el > > comando "quit" > > El error solo me lo lanza cuando he salido por medio del "quit". > > > > Aviso que está escrito en python3, y se que hay mejores formas de > > hacer esto en vez de usar hilos, como el módulo twisted (sin > > compatibilidad python3) o el asyncore, pero solo tengo planeado > > recibir un par de conexiones simultáneas por lo que no se generarán > > muchos hilos. > > > > Pongo una versión simplificada del programa, con solo lo básico para > > ilustrar el problema: > > > > #! /usr/bin/env python3 > > > > import threading > > import socket > > import sys > > import time > > > > class TelnetServer(threading.Thread): > > > >def __init__(self): > >threading.Thread.__init__(self) > >self.socketserver = socket.socket() > >self.socketserver.bind(('', )) > >self.socketserver.listen(5) > > > >def run(self): > >print('Servidor en marcha') > >while True: > >socketclient, addr = self.socketserver.accept() > >client = TelnetClient(socketclient, addr) > >client.start() > > > >def close(self): > >print('Servidor detenido') > > > > class TelnetClient(threading.Thread): > > > >def __init__(self, socketclient, addr): > >threading.Thread.__init__(self) > >self.socketclient = socketclient > >self.addr = addr > > > >def run(self): > >print('Conexión: %s:%s' % (self.addr[0], self.addr[1])) > >while True: > >try: > >command, args = self.prompt() > >except socket.error: > >self.close() > >break > > > >if command == None: > >pass > >elif command == 'quit': > >self.close() > >break > >else: > >self.send('Comando desconocido\n') > > > >def send(self, msg): > >self.socketclient.send(msg.encode('utf8')) > > > >def recv(self): > >return self.socketclient.recv(1024).decode('utf8')[:-2] > > > >def prompt(self): > >try: > >self.send('prompt> ') > >recv_list = self.recv().split() > >return recv_list[0].lower(), recv_list[1:] > >except IndexError: > >return None, [] > > > >def close(self): > >self.socketclient.close() > >print('Desconexión: %s:%s' % (self.addr[0], self.addr[1])) > > > > if __name__ == '__main__': > >try: > >telnetserver = TelnetServer() > >telnetserver.daemon = True > >telnetserver.start() > > > >while True: > >time.sleep(100) > > > >except KeyboardInterrupt: > >telnetserver.close() > >sys.exit() > > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Crear scripts como demonios
Hola lista, Intento crear un demonio de un Script sockets en python que debe permanecer aunque cierre la shell, el caso que leyendo la documentación del modulo daemon veo lo siguiente: from spam import do_main_program El caso que dicho módulo spam no lo encuentro por ningún lado, uso Ubuntu 11.10 y no veo nada. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Crear scripts como demonios
Al final lo deje con un simple fork añadiendo an principio eso: import os, sys pid = os.fork() if pid > 0: sys.exit(0) Gracias por responder :) El 21 de noviembre de 2011 08:16, Jesús Espino escribió: > Otra opción, aunque con un enfoque distinto seria usar "supervisor", > que es un programa python que sirve para tener servicios levantados. > > Un saludo. > > 2011/11/21 Daπid : > > 2011/11/20 chakalinux : > >> from spam import do_main_program > >> > >> El caso que dicho módulo spam no lo encuentro por ningún lado, > > > > Jeje, has caído en un chiste. > > > > En la documentación de Python, como nombres de relleno (variables > > cualesquiera, strings arbitrarias, etc.) se usan términos sacados de > > los Monty Pythons, como eggs, bacon, spam, knights_who_say_ni... > > > > En tu caso, eso significa que tienes que tener un archivo llamado > > spam.py, con el programa encapsulado en la función do_main_program. > > > > > > Si no quieres tener dos archivos, probablemente (no lo he probado, no > > soy experto, estoy especulando mucho), puedas escribirlo todo dentro > > del bloque with daemon.DaemonContext(): > > ___ > > Python-es mailing list > > Python-es@python.org > > http://mail.python.org/mailman/listinfo/python-es > > FAQ: http://python-es-faq.wikidot.com/ > > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Script como demonio
A ver, tengo un script que se conecta al iRC obviamente mediante sockets y este hace un os.fork() para mantenerlo abierto cuando cierro la shell, el caso que es curioso ya que cuando lo ejecuto la shell me devuelve correctamente el promt: shell:~$ ./Script.py shell:~$ Hasta ahí correcto, funciona, el tema y la curiosidad es cuando cierro la shell sigue funcionando pero dicho script abre un archivo (f = file("archivo")), pues bien, parece que cuando cierro la shell no encuentra el archivo, en el momento que entro a la shell de nuevo el archivo lo localiza manteniendo el script ejecutado en "2 plano". ¿ Por que pasa esto ?. Para hacernos una idea tengo +/- esto: import ... pid = os.fork() if pid > 0: sys.exit(0) [...] f = file("archivo.log") for line in f.readlines() [] ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Script como demonio
eso pense yo, pero por que si encuentra el archivo cuando mantengo la shell ? :) probe a añadir lo siguiente despues del fork: os.chdir('/') Pero nada, el archivo a abrir es una ruta absoluta del tipo: /home/user/logs/archivo.log, no lo entiendo mmm El 22 de noviembre de 2011 14:38, Carlos Herrera Polo < carlos.herrerap...@gmail.com> escribió: > Posiblemente sea un asunto de rutas y tener que indicar el path del > archivo > > El 22/11/11, chakalinux escribió: > > A ver, tengo un script que se conecta al iRC obviamente mediante sockets > y > > este hace un os.fork() para mantenerlo abierto cuando cierro la shell, el > > caso que es curioso ya que cuando lo ejecuto la shell me devuelve > > correctamente el promt: > > > > shell:~$ ./Script.py > > shell:~$ > > > > Hasta ahí correcto, funciona, el tema y la curiosidad es cuando cierro la > > shell sigue funcionando pero dicho script abre un archivo (f = > > file("archivo")), pues bien, parece que cuando cierro la shell no > encuentra > > el archivo, en el momento que entro a la shell de nuevo el archivo lo > > localiza manteniendo el script ejecutado en "2 plano". ¿ Por que pasa > esto > > ?. > > > > Para hacernos una idea tengo +/- esto: > > > > import ... > > > > pid = os.fork() > > if pid > 0: > > sys.exit(0) > > > > [...] > > > > f = file("archivo.log") > > for line in f.readlines() > > [] > > > > -- > Enviado desde mi dispositivo móvil > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Script como demonio
Si, y no pilla la ruta como si no existiera: Traceback (most recent call last): File "./X.py", line 49, in os.chdir("/home/redirc/services/logs") OSError: [Errno 2] No such file or directory: '/home/redirc/services/logs' shell:~$ ls /home/redirc/services/logs services.log.20110814 services.log.2014 services.log.2017 services.log.2020 services.log.2012 services.log.2015 services.log.2018 services.log.2021 services.log.2013 services.log.2016 services.log.2019 services.log.2022 NO lo entiendo ... El 22 de noviembre de 2011 15:43, Carlos Herrera Polo < carlos.herrerap...@gmail.com> escribió: > Para descartar... > > Has probado abriendo el archivo con la ruta completa a ver si lo hace > desde el servicio ? > > f = file("/home/user/logs/archivo.log") > > El 22 de noviembre de 2011 09:06, chakalinux escribió: > > eso pense yo, pero por que si encuentra el archivo cuando mantengo la >> shell ? :) >> >> probe a añadir lo siguiente despues del fork: >> >> os.chdir('/') >> >> Pero nada, el archivo a abrir es una ruta absoluta del tipo: >> /home/user/logs/archivo.log, no lo entiendo mmm >> >> >> El 22 de noviembre de 2011 14:38, Carlos Herrera Polo < >> carlos.herrerap...@gmail.com> escribió: >> >>> Posiblemente sea un asunto de rutas y tener que indicar el path del >>> archivo >>> >>> El 22/11/11, chakalinux escribió: >>> > A ver, tengo un script que se conecta al iRC obviamente mediante >>> sockets y >>> > este hace un os.fork() para mantenerlo abierto cuando cierro la shell, >>> el >>> > caso que es curioso ya que cuando lo ejecuto la shell me devuelve >>> > correctamente el promt: >>> > >>> > shell:~$ ./Script.py >>> > shell:~$ >>> > >>> > Hasta ahí correcto, funciona, el tema y la curiosidad es cuando cierro >>> la >>> > shell sigue funcionando pero dicho script abre un archivo (f = >>> > file("archivo")), pues bien, parece que cuando cierro la shell no >>> encuentra >>> > el archivo, en el momento que entro a la shell de nuevo el archivo lo >>> > localiza manteniendo el script ejecutado en "2 plano". ¿ Por que pasa >>> esto >>> > ?. >>> > >>> > Para hacernos una idea tengo +/- esto: >>> > >>> > import ... >>> > >>> > pid = os.fork() >>> > if pid > 0: >>> > sys.exit(0) >>> > >>> > [...] >>> > >>> > f = file("archivo.log") >>> > for line in f.readlines() >>> > [] >>> > >>> >>> -- >>> Enviado desde mi dispositivo móvil >>> ___ >>> Python-es mailing list >>> Python-es@python.org >>> http://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >> >> >> ___ >> Python-es mailing list >> Python-es@python.org >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Script como demonio
No ahí links, son archivos simples, el tema que no veo como resolverlo, el tema es cuando se re realiza la llamada a fork() y sales de la shell, el archivo sigue ejecutandose y funciona todo menos cuando desde la aplicación que en este caso es un cliente iRC intento leer el log, me dice que no existe, en cuanto entro a la shell remota lo encuentra por arte de magia sin tocar nada :) El 22 de noviembre de 2011 16:44, Jose Caballero escribió: > Tienes links? > He buscado rapido en google "os.chdir fail" y los primeros enlaces hablan > de problemas potenciales cuando el path incluye links. > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Script como demonio
Ya lo he conseguido, creo que el problema estaba al usar la librería blob para listar los archivos que ahí en un directorio, en su ausencia uso os.popen("ls %s" % path), es curioso pero quitandolo ahora si "lee" el archivo fuera de la shell antes tenia esto: [...] from glob import glob for archive in glob("%s/*" % path): if not os.path.isfile(archive): continue f = open(archive) for line in f.readlines(): if search.rstrip().lower() in line.lower(): lines.append(line.rstrip('\n')) i += 1 f.close() [...] Por esto (funciona): [...] for archive in os.popen("ls %s" % dirlog).readlines(): if not os.path.isfile("%s%s" % (dirlog, archive.rstrip("\n"))): continue f = open("%s%s" % (dirlog, archive.rstrip("\n"))) for line in f.readlines(): if search.rstrip().lower() in line.lower(): lines.append(line.rstrip('\n')) i += 1 f.close() [...] Un saludo El 22 de noviembre de 2011 17:34, Oswaldo escribió: > El 22/11/2011 16:58, chakalinux escribió: > > No ahí links, son archivos simples, el tema que no veo como resolverlo, >> el tema es cuando se re realiza la llamada a fork() y sales de la shell, >> el archivo sigue ejecutandose y funciona todo menos cuando desde la >> aplicación que en este caso es un cliente iRC intento leer el log, me >> dice que no existe, en cuanto entro a la shell remota lo encuentra por >> arte de magia sin tocar nada :) >> >> > Haz un ejemplo los mas simple posible, pero en el que se reproduzca el > problema y envialo en un archivo adjunto a la lista para que podamos > comprobar. > > > -- > Oswaldo > > __**_ > Python-es mailing list > Python-es@python.org > http://mail.python.org/**mailman/listinfo/python-es<http://mail.python.org/mailman/listinfo/python-es> > FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/> > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Crear scripts como demonios
Una pagina muy interesante ..., gracias Enviado desde mi iPhone El 30/11/2011, a las 16:36, Gerardo Diez escribió: > El día 28 de noviembre de 2011 00:24, Angel Claudio Alvarez > escribió: >> El sáb, 26-11-2011 a las 00:56 -0200, Carlos Do Carmo escribió: >>> El 20/11/2011 12:40, chakalinux escribió: >>>> Hola lista, >>>> >>>> Intento crear un demonio de un Script sockets en python que debe >>>> permanecer aunque cierre la shell, el caso que leyendo la >>>> documentación del modulo daemon veo lo siguiente: >>>> >>>> from spam import do_main_program >>>> >>>> El caso que dicho módulo spam no lo encuentro por ningún lado, uso >>>> Ubuntu 11.10 y no veo nada. >>>> >>>> >>>> ___ >>>> Python-es mailing list >>>> Python-es@python.org >>>> http://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>> Estimado. >>> >>> En mi caso tengo echo un script que se conecta a una interfaz que >>> controla los surtidores de una estacion de servicio, este script esta en >>> ejecucion desde que arranca el sistema para esto hago lo siguiente >>> >>> Edite el archivo >>> /etc/rc.local >>> >>> y le coloque la ruta de donde esta el script vale aclarar que el script >>> debe tener permiso de ejecucion, dentro del archivo /etc/rc.local tengo >>> lo siguiente >>> >>> nohup python /usr/local/bin/conexionSurtidor.py > /home/usuario/log1.txt & >>> >>> >> Tambien lo puede hacer de la forma correcta: >> cerrar stdin stdout y stderr, pasar a / y hacer depender el daemon de >> init >> >> >>> Espero que te sea de utilidad. >>> >>> Saludos. >>> > > Proviene de otra lista. Igual es interesante revisar estos enlaces: > http://econcept.es/python-daemon > https://bitbucket.org/jsabater/python-daemon/wiki/Home >>> >>> ___ >>> Python-es mailing list >>> Python-es@python.org >>> http://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> ___ >> Python-es mailing list >> Python-es@python.org >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Tratar datos txt entre filas
Por que no usas la función *map* ? precisamente hace eso, "compara" 2 listas y retorna según una condición, ejemplo: def Compara(x, y): if x > 100: return x l1 = (1,2,3,4,5,6, 100, 101) l2 = (1,2,3,0,0,6, 99, 100) filtro = map(Compara, l1, l2) print filtro [None, None, None, None, None, None, None, 101] Un saludo El 17 de enero de 2013 10:46, Carlos Agulló Calvo escribió: > hola > > Hace ya tiempo pregunté varias dudas sobre el tratamiento de datos que > están en un .txt desde entonces, he conseguido varios progresos, pero ahora > me he quedado estancado en un punto del que no se salir. > > Mi duda consiste en lo siguiente: > > tengo los datos de la siguiente manera: > > "0303201";1/4/2009 > 0:01:00;2;0;0;0;0;117;44;163;2;0;0;0;-127;2;-127;-127;-127;-127;0 > "0303201";1/4/2009 > 0:02:00;2;1;0;0;0;104;92;255;1;0;1;1;-127;1;-127;-127;-127;-127;0 > (Es un extracto) > > y querría poder compararlos entre las filas para aplicar una serie de > filtros y en función de si cumplen o no los filtros que vayan a archivos > separados. > > He pensado que debería hacer que cada fila fuera una lista y por eso he > hecho este programa: > > leer=open("datos.txt","r") > lista=open("datos_lista.txt","a") > validos=open("est_0303201_VAL.txt","a") > no_validos=open("est_0303201_ERR.txt","a") > > for i in leer.readlines(): #con esto lee cada línea > datos=i.strip().split(";") #guarda cada linea como una lista > lista.write(str(datos)+"\n") #escribe en VALIDOS (datos_lista.txt) > las lineas como listas [,] > > > > leer.close() > validos.close() > > que me crea 2 archivos vacíos y uno con los datos en forma de listas así: > > ['"0303201"', '1/4/2005 0:01:00', *'2', '0'*, '0', '0', '0', '143', > '-127', '-127', '2', '0', '0', '0', '-127', '2', '-127', '-127', '-127', > '-127', '0'] > ['"0303201"', '1/4/2005 0:02:00', *'0', '100'*, '0', '0', '0', '106', > '-127', '-127', '1', '0', '1', '1', '-127', '1', '-127', '-127', '-127', > '-127', '0'] > (es un extracto) > > El problema es que no sé cómo poner los filtros. > > Por ejemplo, quiero que si la columna en negrita 1 es cero y la columna > en negrita 2 es 100 se considere error. > > o que en el siguiente ejemplo: > > ['"0303201"', '1/4/2005 0:01:00', '2', '0', '0', '0', '0', *'143'*, > '-127', '-127', '2', '0', '0', '0', '-127', '2', '-127', '-127', '-127', > '-127', '0'] > ['"0303201"', '1/4/2005 0:02:00', '0', '100', '0', '0', '0', *'106'*, > '-127', '-127', '1', '0', '1', '1', '-127', '1', '-127', '-127', '-127', > '-127', '0'] > (es un extracto) > > si en la fila 2 la columna en negrita es menor que en la fila 1 también de > error. > > (luego pondría yo que me diga el filtro que no cumple, pero eso creo que > lo sé hacer). > > ¿Podríais ayudarme? > > Muchas gracias > > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] py2exe en ubuntu
Hola, intento instalar py2exe y no lo he logrado, me baje py2exe-0.6.9 de sourceforge y al intentar instalarlo me dice que no encuentra la librería windows.h, por mas que busco no la encuentro: Me sale lo siguiente: python setup.py install -> /home/c/Descargas/py2exe-0.6.9/py2exe/build_exe.py:16: DeprecationWarning: the sets module is deprecated import sets running install running build running build_py running build_ext building '_memimporter' extension gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DPYTHONDLL=\"PYTHON26.DLL\" -DPYTHONCOM=\"pythoncom26.dll\" -I/usr/include/python2.6 -c source/MemoryModule.c -o build/temp.linux-x86_64-2.6/source/MemoryModule.o :0: warning: missing terminating " character :0: warning: missing terminating " character source/MemoryModule.c:30: warning: ignoring #pragma warning *source/MemoryModule.c:32: fatal error: Windows.h: No existe el archivo o directorio* compilation terminated. error: command 'gcc' failed with exit status 1 Un saludo ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Archivo en uso
si no te deja sobreescribirlo puedes usar *inuse.exe* que te va* *permitir la sustitución de archivos que estén en uso por parte del Sistema Operativo y que de otra manera no podrían ser sustituidos El 10 de enero de 2011 21:25, Enrique Nuñez escribió: > Estimados: > Buenas tardes, estoy haciendo un programa de copias de seguridad (a la > medida) y quisiera saber si es posible determinar que un archivo, en > particular bajo windows, esta siendo ocupado antes de iniciar su > respaldo. Si es posible, agradeceré cualquier referencia. > > Atte. > Enrique Nuñez > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] regex
Hola, intento buscar palabras en una cadena usando regexp, a ver si me explico, si tengo por ejemplo esta cadena: cad = u"hola como están" Quiero que me re me encuentre la cadena cad (puede variar) independientemente de su posición, (creo que se llama lookahead), o sea: "como estan ustedes hola" => true "hola, ustedes estan bien ? como están" => true [...] Solo he llegado a esto: re.match("(?=.*hola)(?=.*como)(?=.*est.n)", cad) Esto me funciona pero no me interesa ya que me devuelve siempre true aunque ponga: "hola como estan" y si quito ".*" no me funciona y solo me interesa que encuentra las palabras exactas independientemente del orden que estén. ... Un saludo ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] regex
No lo tengo claro si es lookahead o no, el tema es buscar palabras independientemente del orden que aparezcan Replanteo la pregunta: ¿ Hay alguna manera usando (regex o no) para que localice la cadena independientemente del orden ? Se me ocurre algo como: msg="hola gente, ubuntu esta bien. Alguien me puede decir que es?" patron="que es ubuntu" Comprueba(msg, patron) def Comprueba(msg, patron): for word in patron.split(): if msg.find(word) == -1: return False return True Un saludo El 27 de enero de 2011 19:53, Chema Cortes escribió: > El día 27 de enero de 2011 18:27, chakalinux > escribió: > > Hola, intento buscar palabras en una cadena usando regexp, a ver si me > > explico, si tengo por ejemplo esta cadena: > > > > cad = u"hola como están" > > > > Quiero que me re me encuentre la cadena cad (puede variar) > > independientemente de su posición, (creo que se llama lookahead), o sea: > > > > "como estan ustedes hola" => true > > "hola, ustedes estan bien ? como están" => true > > [...] > > > > Solo he llegado a esto: > > > > re.match("(?=.*hola)(?=.*como)(?=.*est.n)", cad) > > > > Esto me funciona pero no me interesa ya que me devuelve siempre true > aunque > > ponga: "hola como estan" y si quito ".*" no me funciona > y > > solo me interesa que encuentra las palabras exactas independientemente > del > > orden que estén. > > No entiendo bien qué problema planteas. El "lookahead" ("ver > adelante") sirve para vincular un patrón de búsqueda con lo que > aparece más adelante en la cadena. En realidad en el patrón de > búsqueda que propones no indicas qué tiene que buscar (los "lookahead" > no seleccionan nada). > > Si tienes las cosas claras, puede que el módulo 're' sirva para tus > propósitos, pero a veces es mejor no obsesionarse con ello y tratar de > hacerte tus propias búsquedas a medida. Otra forma de verlo es > descomponiendo el problema en procesos más sencillos, tal vez > concatenando dos búsquedas. > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] regex
Tan mal me explico ? a ver. quería buscar una cadena teniendo en cuenta unos patrones, los patrones pueden variar su orden (a, b, c OR b, c, a OR c, b ,a [...]) peor ya lo he resuelto. Es un programa para el irc que conecta a una base de datos sqlite3 y responde según la pregunta, por ejemplo: pepito: Que es ubuntu? bot: pepito, http://es.wikipedia.org/wiki/Ubuntu La respuesta del bot es automática, en este caso los patrones son: "que es ubuntu", si el usuario pepito hubiera preguntado: pepito: ubuntu ... y eso que es ? La respuesta sería la misma, a eso me refería antes con independientemente del orden buscar la cadena. La función es esta: def SearchQuestion(name): cnn = sqlite3.connect("db/profe.db") pexc = cnn.cursor() patron, msg = pexc.execute(u'SELECT patron, respuesta FROM profe;').fetchone() cnn.close() name = name.rstrip("?").rstrip("¿") cicle = False if patron: for word in patron.split(): for word2 in name.split(): if word2 == word: cicle = True break if not cicle:return None cicle = False return msg return None Un saludo y perdona si no me explique correctamente. El 27 de enero de 2011 19:06, Jose Caballero escribió: > > > El 27 de enero de 2011 12:27, chakalinux escribió: > > Hola, intento buscar palabras en una cadena usando regexp, a ver si me >> explico, si tengo por ejemplo esta cadena: >> >> cad = u"hola como están" >> >> Quiero que me re me encuentre la cadena cad (puede variar) >> independientemente de su posición, (creo que se llama lookahead), o sea: >> >> "como estan ustedes hola" => true >> "hola, ustedes estan bien ? como están" => true >> [...] >> >> Solo he llegado a esto: >> >> re.match("(?=.*hola)(?=.*como)(?=.*est.n)", cad) >> >> Esto me funciona pero no me interesa ya que me devuelve siempre true >> aunque ponga: "hola como estan" y si quito ".*" no me >> funciona y solo me interesa que encuentra las palabras exactas >> independientemente del orden que estén. >> >> ... >> >> > > No he entendido nada. > > A ver si me aclaro... > > Tienes una cadena inicial, por ejemplo c1="hola como estan". > Luego tienes una segunda cadena c2. > Y ahora quieres ... > > (1) saber is c1 es parte de c2. > (2) saber si todas las palabras de c1 estan en c2. > (3) saber si alguna de las palabras de c1 esta en c2. > (4)... > > > > > > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] regex
gracias ... El 28 de enero de 2011 17:26, matt ledding escribió: > +1 x nltk.org/book ... > > sino, por un bot mas sencilla, hay AIML (Artificial Intelligence Markup > Language), pero sobre todo reversedAIML (http://charlix.sourceforge.net/)que > tiene otros ideas interesantes. Puedes crear patrones (ie: "eso que > es"="que es" antes de substantivo precedente.) > http://pyaiml.sourceforge.net existe como compilidor de AIML, y > http://howie.sourceforge.net/ es un opensource AIML chatbot en python si > quieres ver ideas de codigo. Todos en inglés, por cierto... > > Matt > > > > 2011/1/27 lasizoillo > > El día 27 de enero de 2011 22:14, chakalinux >> escribió: >> > Tan mal me explico ? a ver. quería buscar una cadena teniendo en cuenta >> unos >> > patrones, los patrones pueden variar su orden (a, b, c OR b, c, a OR c, >> b ,a >> > [...]) peor ya lo he resuelto. >> > >> > Es un programa para el irc que conecta a una base de datos sqlite3 y >> > responde según la pregunta, por ejemplo: >> > >> > pepito: Que es ubuntu? >> > bot: pepito, http://es.wikipedia.org/wiki/Ubuntu >> > >> > La respuesta del bot es automática, en este caso los patrones son: "que >> es >> > ubuntu", si el usuario pepito hubiera preguntado: >> > >> > pepito: ubuntu ... y eso que es ? >> > >> >> linux_boy: creo que ubuntu es la mejor distro para empezar >> bot: linux_boy, http://es.wikipedia.org/wiki/Ubuntu >> >> linux_boy: tiovivo, con ubuntu no pasaría >> tiovivo: eso que es? >> linux_boy: tiovivo, mira en http://es.wikipedia.org/wiki/Ubuntu >> >> El algoritmo que propones va a fallar con falsos positivos (primer >> ejemplo) y falsos negativos (segundo ejemplo). La gran ventaja es que >> es muy simple. Si te interesa el tema del procesamiento del lenguaje >> natural puedes echarle un vistazo al libro del nltk: >> http://www.nltk.org/book >> >> Para implementar tu algoritmo yo usaría sets. Es facil con ellas ver >> si un conjunto de palabras (ubuntu, que, es) está contenido en el >> conjunto de palabras del mensaje de IRC. >> >> Saludos: >> >> Javi >> ___ >> Python-es mailing list >> Python-es@python.org >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> > > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] problemas cadenas unicode
Buenas, bueno ... vengo con un problema que llevo arrastrando unos días. Tengo el siguiente problema, me llega una cadena de texto de retorno (result) y esta no es unicode pero contiene caracteres acentuados, ñ, etc ... result = profe.SearchQuestion(message, nickname.split("!")[0]) > > if result: > s.send("PRIVMSG %s :%s, %s\r\n" % (channel, nick, result)) > He probado varias cosas para codificar: s.send(unicode(("PRIVMSG %s :%s, %s\r\n" % (channel, nick, result > o: if type(txt) not is unicode: txt = txt.decode("utf-8") > >> else: txt = txt.decode("iso-8859-15") >> > s.send("PRIVMSG %s :%s, %s\r\n" % (channel, nick, txt)) El caso es que desde mi entorno IDE cuando lo ejecuto no me casca y si lo ejecuto en un terminal casca con errores tipo: Traceback (most recent call last): File "./irc.py", line 327, in Irc() File "./irc.py", line 118, in __init__ s.send((unicode("PRIVMSG %s :%s, %s\r\n" % (channel, nick, result UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 61: ordinal not in range(128) Parece que desde el terminal trata a las cadenas como ascii ! y no tenia por que ... vamos, no entiendo como en el IDE funciona y en el terminal no. Uso pydev como IDE y bash para lanzar el programa. Si sirve de algo en las cabeceras de cada archivo tengo: #!/usr/bin/env python # -*- coding: utf-8 -*- [...] y esto por se acaso: $ locale LANG=es_ES.utf8 LC_CTYPE="es_ES.utf8" LC_NUMERIC="es_ES.utf8" LC_TIME="es_ES.utf8" LC_COLLATE="es_ES.utf8" LC_MONETARY="es_ES.utf8" LC_MESSAGES="es_ES.utf8" LC_PAPER="es_ES.utf8" LC_NAME="es_ES.utf8" LC_ADDRESS="es_ES.utf8" LC_TELEPHONE="es_ES.utf8" LC_MEASUREMENT="es_ES.utf8" LC_IDENTIFICATION="es_ES.utf8" LC_ALL= Un saludo ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] problemas cadenas unicode
En principio si, pero al parecer venia codificado y el problema venia desde el principio cuando recibía datos: buffer = s.recv(4028).encode('utf-8') lo deje: buffer = s.recv(4028) Y listo, ya funciona en terminal. Lo que me parecía raro que es cuando lo lanzaba desde pydev no cascaba la codificación y en terminal si, es que el rollo es que en teoría python ya trabaja según convenga en unicode pero al trabajar con bases de datos sqlite la cosa cambia. Un saludo El 1 de febrero de 2011 09:55, peter escribió: > El día 1 de febrero de 2011 00:36, chakalinux > escribió: > > > Traceback (most recent call last): > > File "./irc.py", line 327, in > > Irc() > > File "./irc.py", line 118, in __init__ > > s.send((unicode("PRIVMSG %s :%s, %s\r\n" % (channel, nick, result > > UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 61: > > ordinal not in range(128) > > > ¿Te das cuenta de que intentabas enviar unicode sin codificar? Y > python te lo codifica como ascii, claro. > Codifícalo explícitamente (con la codificación que use esa red de irc) > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Bot irc modular
Hola de nuevo :) Miren, me estoy comiendo la,cabeza para hacer un bot/cliente IRC modular, me explico. Quiero partir de una librería irc que ya la tengo pero no se como implementarlo para que la aplicación se pueda extender fácilmente, en xchat el programa esta conectado al IRC y para cargar una extensión por ejemplo de python se usa: /py load modulo.py modulo.py tiene en su cabezera entre otras: import xchat En mi caso no se como hacerlo, estoy encaminado por algo así: ## botlib.py ## class Bot(): def __init__(self): self.nick = "pepito" self.nickpassword = "" self.username = os.getenv("USERNAME") self.hostname = os.getenv("HOSTNAME") self.realname = os.getenv("USERNAME") self.server = "irc-hispano.org" self.port = 6667 [...] def run(self): self.s = socket.socket() [...] dev RecvMsg(self): # Aqui cojo nick, canal, mensaje, ... return nick, channel, message ## y ahora si quiero hacer un modulo para que haga "algo" el bot la cosa sería: import bot class Seen(bot.Bot): def __init__(self): self.nick = "yo" [...] def run(self): datos = self.recv(self.nick, self.name, self.data) print datos seen = Seen() seen.run() Total, no se como cogerlo :), la idea es fácil en principio, cargar la librería y la usas pero no se como enlazar en el caso anterior el evento RecvMsg() con un modulo externo y es un poco coñazo hacerlo con clases, no se si hay alguna manera mejor y mas limpia. EL problema que tiene el anterior ejemplo sin duda es que al instanciar la clase Bot() se ejecutan 2 conexiones simultaneas y claro ... no es lo que se quiere, un ejemplo para este caso es xchat, carga los plugins si se encuentran en X directorio y si instancio o llama a una librería que solo contiene funciones no se como hacer en el modulo para que cuando le diga: "Darme datos si los recibes" me los de ... jajajja perdonad si me explico mal, si supiera explicar el problema no lo preguntaría. Un saludo ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/