From agtugo en gmail.com Tue Apr 9 22:20:47 2019 From: agtugo en gmail.com (AGTUGO) Date: Tue, 9 Apr 2019 19:20:47 -0700 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded Message-ID: Hola Lista de python es espa;ol, Espero que les guste el formato de mi pregunta con comentarios import operator as op from operator import itemgetter # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas reglas # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda #Estas son las columnas de inter'es, se analizar'a renglon por rengl'on idx_columns = (2,5,6) # Estas reglas pueden cambiar y las quiero lo menos "hardcoded posible" # dentro de la funcion funct_to_receive # quiero hacer un set de reglas # por cada csv por eso las quiero afuera de la funci'on para poderlas cambiar # si es posible un python file por cada csv, o un configuration file pero no se # como guardaria esas comparaciones en un string por ejemplo # ____________________AQUI ES LA PREGUNTA__________________ # ______Esta es la parte que me causa conflicto___________ # uso un set de reglas de comparacion que guardo en una lista # pero siento que no lo estoy haciendo de la forma correcta, # es esta solucion muy hacky? poco pythonica? def rule1(ele): return ele == 'watermelon' def rule2(ele): return ele != 'None' def rule3(ele): return (ele == 'peach' or ele == '') #Esto lo uso como input en la funcion rules = [ rule1, rule2, rule3] # funcion que guarda cada renglon, busca en otra base de datos para cotejar # informacion y la convierte en diccionario para ser usada como entrada # para un template de JINJA2 para generacion de codigo def func_to_receive(csv_file, idx_ele_tbc, rules): #To-do: Implementar pass # Este es el caso para un solo renglon list_to_be_compared = ['apple', 'orange', 'watermelon', 'carrots', 'kiwi' , 'None' , ''] #Aqui aislo solo los elementos que me interesan (celdas) elements_to_be_compared = itemgetter(*idx_columns)(list_to_be_compared) #Aqui aplico las comparaciones la regla que le corresponde a cada columna list_comparisons = [rule(ele) for rule,ele in zip(rules, elements_to_be_compared)] all_comparison = all(list_comparisons) print(all_comparison) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Apr 10 07:18:27 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 10 Apr 2019 13:18:27 +0200 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: El mié., 10 abr. 2019 a las 4:21, AGTUGO () escribió: > Hola Lista de python es espa;ol, > > Espero que les guste el formato de mi pregunta con comentarios > > import operator as op > from operator import itemgetter > > # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas > reglas > # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda > En román paladino: quieres filtrar líneas de un texto CSV cuyos campos cumplan una serie de reglas. Intenta identificar cuáles son los *invariantes* del proceso y desacoplar lo que se pueda. En este caso concreto, el procesado línea a línea de un fichero no debería depender de las reglas a aplicar ni de qué elementos concretos se van a chequear. Lo mejor es asumir que en el procesado del fichero únicamente aplicar una regla por línea. Con ello, el trabajo se reduce a combinar varias reglas en una sola: rules = (rule1, rule2, rule3) sels = (2, 5, 6) def pred(register): selector = itemgetter(*sels) return all(rule(ele) for rule in rules for ele in selector(register)) A su vez, el fichero de reglas puede asumir que siempre actúa sobre un registro de elementos (una lista). Según como sea, puedes sacar estas reglas a otros ficheros con la idea de poder cambiar fácilmente de reglas cambiando unos ficheros por otros. Yendo más allá, podrías tener una colección de reglas predefinidas y crear con ellas conjuntos (RuleSets), y asociar un RuleSet para cada ficheros CSV. Las combinaciones son innumerables y se puede complicar todo lo que se quiera. -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nimbiotics en gmail.com Wed Apr 10 10:52:34 2019 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Wed, 10 Apr 2019 10:52:34 -0400 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: Hola Agtugo, Quizas te interese echarle una mirada a la libreria pyparsing; a mi me fue de mucha ayuda en un proyecto muy similar. Aunque hay una curva de aprendizaje, estoy seguro que no te tomaria mas que algunas horas aprender a crear las reglas que necesitas aplicar. En realidad es muy intuitivo. Hay muchas librerias de similar utilidad, pero essta es la que tiene, en mi humilde opinion, la menos pronunciada curva de aprendizaje. La ventaja de esta solucion es que te permite la encapsulacion mas detallada de las reglas y acciones, haciendo mas facil realizar cambios en el futuro. Dtb/Gby ======= Mario R. Osorio B.A.S. of Information Technology Web page: *http;//mario.osorio.solutions * Email: *mario en osorio.solutions* *Just Choose Python!* *SQL programmers don't die, they just ROLLBACK the TRANSACTION.* On Tue, Apr 9, 2019 at 10:22 PM AGTUGO wrote: > Hola Lista de python es espa;ol, > > Espero que les guste el formato de mi pregunta con comentarios > > import operator as op > from operator import itemgetter > > # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas > reglas > # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda > > #Estas son las columnas de inter'es, se analizar'a renglon por rengl'on > idx_columns = (2,5,6) > > # Estas reglas pueden cambiar y las quiero lo menos "hardcoded posible" > # dentro de la funcion funct_to_receive # quiero hacer un set de reglas > # por cada csv por eso las quiero afuera de la funci'on para poderlas > cambiar > # si es posible un python file por cada csv, o un configuration file pero > no se > # como guardaria esas comparaciones en un string por ejemplo > > # ____________________AQUI ES LA PREGUNTA__________________ > # ______Esta es la parte que me causa conflicto___________ > # uso un set de reglas de comparacion que guardo en una lista > # pero siento que no lo estoy haciendo de la forma correcta, > # es esta solucion muy hacky? poco pythonica? > > def rule1(ele): > return ele == 'watermelon' > def rule2(ele): > return ele != 'None' > def rule3(ele): > return (ele == 'peach' or ele == '') > > #Esto lo uso como input en la funcion > > rules = [ rule1, rule2, rule3] > > # funcion que guarda cada renglon, busca en otra base de datos para > cotejar > # informacion y la convierte en diccionario para ser usada como entrada > # para un template de JINJA2 para generacion de codigo > > def func_to_receive(csv_file, idx_ele_tbc, rules): > #To-do: Implementar > pass > > # Este es el caso para un solo renglon > > list_to_be_compared = ['apple', 'orange', 'watermelon', 'carrots', 'kiwi' > , 'None' , ''] > #Aqui aislo solo los elementos que me interesan (celdas) > elements_to_be_compared = itemgetter(*idx_columns)(list_to_be_compared) > > #Aqui aplico las comparaciones la regla que le corresponde a cada columna > > list_comparisons = [rule(ele) for rule,ele in zip(rules, > elements_to_be_compared)] > all_comparison = all(list_comparisons) > print(all_comparison) > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From soft.sirius en gmail.com Thu Apr 11 13:28:19 2019 From: soft.sirius en gmail.com (Juan M. Puertas) Date: Thu, 11 Apr 2019 19:28:19 +0200 Subject: [Python-es] CGI en Python y suexec In-Reply-To: References: <5569D970.2020107@gmail.com> Message-ID: Hola amigos. Por si le sirve a alguien: Tenía un CGI en Python en un VPS con Ubuntu 10. Al pasarme a versiones superiores de Ubuntu el CGI no funcionaba. He descubierto que hay que desactivar suexec. Aquí una web que habla de ello.: https://palatana.wordpress.com/2014/09/25/disable-suexec-in-apache/ Saludos :-) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Thu Apr 11 20:31:31 2019 From: agtugo en gmail.com (AGTUGO) Date: Thu, 11 Apr 2019 17:31:31 -0700 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: Excelente respuesta, aunque no entiendo bien la parte de anidar los fors, ahi estas aplicando todas las reglas en todos los elementos del registro. Perdon por la respuesta rapida, On Wed, Apr 10, 2019 at 4:18 AM Chema Cortes wrote: > El mié., 10 abr. 2019 a las 4:21, AGTUGO () escribió: > >> Hola Lista de python es espa;ol, >> >> Espero que les guste el formato de mi pregunta con comentarios >> >> import operator as op >> from operator import itemgetter >> >> # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas >> reglas >> # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda >> > > > En román paladino: quieres filtrar líneas de un texto CSV cuyos campos > cumplan una serie de reglas. > > Intenta identificar cuáles son los *invariantes* del proceso y desacoplar > lo que se pueda. En este caso concreto, el procesado línea a línea de un > fichero no debería depender de las reglas a aplicar ni de qué elementos > concretos se van a chequear. Lo mejor es asumir que en el procesado del > fichero únicamente aplicar una regla por línea. Con ello, el trabajo se > reduce a combinar varias reglas en una sola: > > rules = (rule1, rule2, rule3) > sels = (2, 5, 6) > > def pred(register): > selector = itemgetter(*sels) > return all(rule(ele) > for rule in rules > for ele in selector(register)) > > > A su vez, el fichero de reglas puede asumir que siempre actúa sobre un > registro de elementos (una lista). Según como sea, puedes sacar estas > reglas a otros ficheros con la idea de poder cambiar fácilmente de reglas > cambiando unos ficheros por otros. > > Yendo más allá, podrías tener una colección de reglas predefinidas y crear > con ellas conjuntos (RuleSets), y asociar un RuleSet para cada ficheros CSV. > > Las combinaciones son innumerables y se puede complicar todo lo que se > quiera. > > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Thu Apr 11 20:32:56 2019 From: agtugo en gmail.com (AGTUGO) Date: Thu, 11 Apr 2019 17:32:56 -0700 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: Hola Mario, Es un proyecto privado dejame ver si pyparsing esta aprobado para usarse, me gusta la idea de crear reglas para filtrar, ahora que lo pienso pandas debe de tener algo as'i, pero la verdad ya esta solucion sin dependencias me e sta funcionando excelente. On Wed, Apr 10, 2019 at 7:53 AM Mario R. Osorio wrote: > Hola Agtugo, > > Quizas te interese echarle una mirada a la libreria pyparsing; a mi me fue > de mucha ayuda en un proyecto muy similar. Aunque hay una curva de > aprendizaje, estoy seguro que no te tomaria mas que algunas horas aprender > a crear las reglas que necesitas aplicar. En realidad es muy intuitivo. Hay > muchas librerias de similar utilidad, pero essta es la que tiene, en mi > humilde opinion, la menos pronunciada curva de aprendizaje. > > La ventaja de esta solucion es que te permite la encapsulacion mas > detallada de las reglas y acciones, haciendo mas facil realizar cambios en > el futuro. > > Dtb/Gby > ======= > Mario R. Osorio > B.A.S. of Information Technology > Web page: *http;//mario.osorio.solutions > * > Email: *mario en osorio.solutions* > *Just Choose Python!* > > *SQL programmers don't die, they just ROLLBACK the TRANSACTION.* > > > > On Tue, Apr 9, 2019 at 10:22 PM AGTUGO wrote: > >> Hola Lista de python es espa;ol, >> >> Espero que les guste el formato de mi pregunta con comentarios >> >> import operator as op >> from operator import itemgetter >> >> # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas >> reglas >> # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda >> >> #Estas son las columnas de inter'es, se analizar'a renglon por rengl'on >> idx_columns = (2,5,6) >> >> # Estas reglas pueden cambiar y las quiero lo menos "hardcoded posible" >> # dentro de la funcion funct_to_receive # quiero hacer un set de reglas >> # por cada csv por eso las quiero afuera de la funci'on para poderlas >> cambiar >> # si es posible un python file por cada csv, o un configuration file pero >> no se >> # como guardaria esas comparaciones en un string por ejemplo >> >> # ____________________AQUI ES LA PREGUNTA__________________ >> # ______Esta es la parte que me causa conflicto___________ >> # uso un set de reglas de comparacion que guardo en una lista >> # pero siento que no lo estoy haciendo de la forma correcta, >> # es esta solucion muy hacky? poco pythonica? >> >> def rule1(ele): >> return ele == 'watermelon' >> def rule2(ele): >> return ele != 'None' >> def rule3(ele): >> return (ele == 'peach' or ele == '') >> >> #Esto lo uso como input en la funcion >> >> rules = [ rule1, rule2, rule3] >> >> # funcion que guarda cada renglon, busca en otra base de datos para >> cotejar >> # informacion y la convierte en diccionario para ser usada como entrada >> # para un template de JINJA2 para generacion de codigo >> >> def func_to_receive(csv_file, idx_ele_tbc, rules): >> #To-do: Implementar >> pass >> >> # Este es el caso para un solo renglon >> >> list_to_be_compared = ['apple', 'orange', 'watermelon', 'carrots', 'kiwi' >> , 'None' , ''] >> #Aqui aislo solo los elementos que me interesan (celdas) >> elements_to_be_compared = itemgetter(*idx_columns)(list_to_be_compared) >> >> #Aqui aplico las comparaciones la regla que le corresponde a cada columna >> >> list_comparisons = [rule(ele) for rule,ele in zip(rules, >> elements_to_be_compared)] >> all_comparison = all(list_comparisons) >> print(all_comparison) >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Fri Apr 12 04:01:20 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Fri, 12 Apr 2019 10:01:20 +0200 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: El vie., 12 abr. 2019 a las 2:32, AGTUGO () escribió: > > Excelente respuesta, aunque no entiendo bien la parte de anidar los fors, > ahi estas aplicando todas las reglas en todos los elementos del registro. > Perdon por la respuesta rapida, > He intentado *imitar* el código que habías puesto. No obstante, lo lógico es que cada regla se aplique a todo el registro y que de ahí seleccione los elementos que necesite comprobar. > > On Wed, Apr 10, 2019 at 4:18 AM Chema Cortes wrote: > >> El mié., 10 abr. 2019 a las 4:21, AGTUGO () escribió: >> >>> Hola Lista de python es espa;ol, >>> >>> Espero que les guste el formato de mi pregunta con comentarios >>> >>> import operator as op >>> from operator import itemgetter >>> >>> # Tengo que analizar varios CSVs y las "celdas" deben de cumplir ciertas >>> reglas >>> # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda >>> >> >> >> En román paladino: quieres filtrar líneas de un texto CSV cuyos campos >> cumplan una serie de reglas. >> >> Intenta identificar cuáles son los *invariantes* del proceso y >> desacoplar lo que se pueda. En este caso concreto, el procesado línea a >> línea de un fichero no debería depender de las reglas a aplicar ni de qué >> elementos concretos se van a chequear. Lo mejor es asumir que en el >> procesado del fichero únicamente aplicar una regla por línea. Con ello, el >> trabajo se reduce a combinar varias reglas en una sola: >> >> rules = (rule1, rule2, rule3) >> sels = (2, 5, 6) >> >> def pred(register): >> selector = itemgetter(*sels) >> return all(rule(ele) >> for rule in rules >> for ele in selector(register)) >> >> >> A su vez, el fichero de reglas puede asumir que siempre actúa sobre un >> registro de elementos (una lista). Según como sea, puedes sacar estas >> reglas a otros ficheros con la idea de poder cambiar fácilmente de reglas >> cambiando unos ficheros por otros. >> >> Yendo más allá, podrías tener una colección de reglas predefinidas y >> crear con ellas conjuntos (RuleSets), y asociar un RuleSet para cada >> ficheros CSV. >> >> Las combinaciones son innumerables y se puede complicar todo lo que se >> quiera. >> >> >> >> -- >> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >> https://blog.ch3m4.org >> Buscador Python Hispano: http://busca.ch3m4.org >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Arturo Muñoz Tolosa > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Fri Apr 12 07:56:53 2019 From: agtugo en gmail.com (AGTUGO) Date: Fri, 12 Apr 2019 06:56:53 -0500 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: En este caso cada regla se aplica a un elemento específico del registro, pero la posición siempre es la misma en todos los registros. On Fri, Apr 12, 2019, 3:01 AM Chema Cortes wrote: > > El vie., 12 abr. 2019 a las 2:32, AGTUGO () escribió: > >> >> Excelente respuesta, aunque no entiendo bien la parte de anidar los fors, >> ahi estas aplicando todas las reglas en todos los elementos del registro. >> Perdon por la respuesta rapida, >> > > He intentado *imitar* el código que habías puesto. No obstante, lo lógico > es que cada regla se aplique a todo el registro y que de ahí seleccione los > elementos que necesite comprobar. > > > > >> >> On Wed, Apr 10, 2019 at 4:18 AM Chema Cortes wrote: >> >>> El mié., 10 abr. 2019 a las 4:21, AGTUGO () escribió: >>> >>>> Hola Lista de python es espa;ol, >>>> >>>> Espero que les guste el formato de mi pregunta con comentarios >>>> >>>> import operator as op >>>> from operator import itemgetter >>>> >>>> # Tengo que analizar varios CSVs y las "celdas" deben de cumplir >>>> ciertas reglas >>>> # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda >>>> >>> >>> >>> En román paladino: quieres filtrar líneas de un texto CSV cuyos campos >>> cumplan una serie de reglas. >>> >>> Intenta identificar cuáles son los *invariantes* del proceso y >>> desacoplar lo que se pueda. En este caso concreto, el procesado línea a >>> línea de un fichero no debería depender de las reglas a aplicar ni de qué >>> elementos concretos se van a chequear. Lo mejor es asumir que en el >>> procesado del fichero únicamente aplicar una regla por línea. Con ello, el >>> trabajo se reduce a combinar varias reglas en una sola: >>> >>> rules = (rule1, rule2, rule3) >>> sels = (2, 5, 6) >>> >>> def pred(register): >>> selector = itemgetter(*sels) >>> return all(rule(ele) >>> for rule in rules >>> for ele in selector(register)) >>> >>> >>> A su vez, el fichero de reglas puede asumir que siempre actúa sobre un >>> registro de elementos (una lista). Según como sea, puedes sacar estas >>> reglas a otros ficheros con la idea de poder cambiar fácilmente de reglas >>> cambiando unos ficheros por otros. >>> >>> Yendo más allá, podrías tener una colección de reglas predefinidas y >>> crear con ellas conjuntos (RuleSets), y asociar un RuleSet para cada >>> ficheros CSV. >>> >>> Las combinaciones son innumerables y se puede complicar todo lo que se >>> quiera. >>> >>> >>> >>> -- >>> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >>> https://blog.ch3m4.org >>> Buscador Python Hispano: http://busca.ch3m4.org >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> -- >> Arturo Muñoz Tolosa >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Fri Apr 12 09:29:42 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Fri, 12 Apr 2019 15:29:42 +0200 Subject: [Python-es] Operadores de comparacion como input de funcion para evitar comparaciones hardcoded In-Reply-To: References: Message-ID: El vie., 12 abr. 2019 a las 13:57, AGTUGO () escribió: > En este caso cada regla se aplica a un elemento específico del registro, > pero la posición siempre es la misma en todos los registros. > Me había perdido entre renglones y listas. Entonces es más simple: rules = (rule1, rule2, rule3) sels = (2, 5, 6) def pred(register): return all(rule(register[idx]) for rule,idx in zip(rules, sels)) De todos modos, se puede hacer de muchas formas. Y complicarlo de muchas formas también. > > On Fri, Apr 12, 2019, 3:01 AM Chema Cortes wrote: > >> >> El vie., 12 abr. 2019 a las 2:32, AGTUGO () escribió: >> >>> >>> Excelente respuesta, aunque no entiendo bien la parte de anidar los >>> fors, ahi estas aplicando todas las reglas en todos los elementos del >>> registro. Perdon por la respuesta rapida, >>> >> >> He intentado *imitar* el código que habías puesto. No obstante, lo >> lógico es que cada regla se aplique a todo el registro y que de ahí >> seleccione los elementos que necesite comprobar. >> >> >> >> >>> >>> On Wed, Apr 10, 2019 at 4:18 AM Chema Cortes wrote: >>> >>>> El mié., 10 abr. 2019 a las 4:21, AGTUGO () escribió: >>>> >>>>> Hola Lista de python es espa;ol, >>>>> >>>>> Espero que les guste el formato de mi pregunta con comentarios >>>>> >>>>> import operator as op >>>>> from operator import itemgetter >>>>> >>>>> # Tengo que analizar varios CSVs y las "celdas" deben de cumplir >>>>> ciertas reglas >>>>> # en caso de que sea as'i todo el rengl'on es de utilidad y se guarda >>>>> >>>> >>>> >>>> En román paladino: quieres filtrar líneas de un texto CSV cuyos campos >>>> cumplan una serie de reglas. >>>> >>>> Intenta identificar cuáles son los *invariantes* del proceso y >>>> desacoplar lo que se pueda. En este caso concreto, el procesado línea a >>>> línea de un fichero no debería depender de las reglas a aplicar ni de qué >>>> elementos concretos se van a chequear. Lo mejor es asumir que en el >>>> procesado del fichero únicamente aplicar una regla por línea. Con ello, el >>>> trabajo se reduce a combinar varias reglas en una sola: >>>> >>>> rules = (rule1, rule2, rule3) >>>> sels = (2, 5, 6) >>>> >>>> def pred(register): >>>> selector = itemgetter(*sels) >>>> return all(rule(ele) >>>> for rule in rules >>>> for ele in selector(register)) >>>> >>>> >>>> A su vez, el fichero de reglas puede asumir que siempre actúa sobre un >>>> registro de elementos (una lista). Según como sea, puedes sacar estas >>>> reglas a otros ficheros con la idea de poder cambiar fácilmente de reglas >>>> cambiando unos ficheros por otros. >>>> >>>> Yendo más allá, podrías tener una colección de reglas predefinidas y >>>> crear con ellas conjuntos (RuleSets), y asociar un RuleSet para cada >>>> ficheros CSV. >>>> >>>> Las combinaciones son innumerables y se puede complicar todo lo que se >>>> quiera. >>>> >>>> >>>> >>>> -- >>>> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >>>> https://blog.ch3m4.org >>>> Buscador Python Hispano: http://busca.ch3m4.org >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> >>> >>> -- >>> Arturo Muñoz Tolosa >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> -- >> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >> https://blog.ch3m4.org >> Buscador Python Hispano: http://busca.ch3m4.org >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Tue Apr 16 16:42:30 2019 From: agtugo en gmail.com (AGTUGO) Date: Tue, 16 Apr 2019 13:42:30 -0700 Subject: [Python-es] Metaprogramando c++ con python ejemplo en lua Message-ID: Hola lista de python, Realmente no se si es offtopic, pero despu'es de auto-generar c'odigo con python para varios lenguajes (entre ellos c++, c, makefiles, Corba IDL, etc.) uno se pregunta si se puede automatizar m'as. Actualmente utilizo python para parsear codigo c y c++ con ayuda de librer'ias, para usarlos como input y generar c'odigo (c++, IDL) usando templates, yo en particular uso JINJA2, siento que es lo suficientemente simple para no complicar demasiado los templates, no tengo ninguna preferencia pero me parece descente. Ahora me gustar'ia no usar templates si no hacer un framework para facilitar la creacion de codigo c++. http://lua-users.org/wiki/CppMetaprogramming #Esto es el ejemplo en lua de metapromacion He usado un poco de lua para experimentar como lo muestra el link, lo cual me parece excelente. A pesar de que lua es un gran lenguaje, la integraci'on con algunas herramientas en mi caso espec'ifico es una labor titanica, me pregunto si hay alguien que este haciendo algo as'i aqu'i o conozcan algo similar para python, en cualquier lenguaje. Ahora algunas cosas que he hecho en python en modo de experimentaci'on es definir la estructura de mi proyecto, y el codigo que conecta todo antes de empezar a escribir todo es auto-generado, no me tengo que preocupar de que las cosas no esten conectadas y dise;o pruebas genericas para probar las interfaces desde antes. Saben si esta pr'actica es com'un? me parece una forma natural de trabajar con lenguajes est'aticos, si cambio el nombre de un archivo no me tengo que preocupar de cambiarlo en todos los lugares donde esta referenciado, el esqueleto del proyecto se hace al inicio y se hace m'as f'acil a;adir la l'ogica despues, a'un tengo problemas por solucionar pero se va facilitando con el tiempo. Realmente me recuerda a algunas IDEs pero con la ventaja de que es mucho m'as personalizable. Saludos ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Apr 17 05:51:54 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 17 Apr 2019 11:51:54 +0200 Subject: [Python-es] Metaprogramando c++ con python ejemplo en lua In-Reply-To: References: Message-ID: El mar., 16 abr. 2019 a las 22:43, AGTUGO () escribió: > Hola lista de python, > > Realmente no se si es offtopic, pero despu'es de auto-generar c'odigo con > python para varios lenguajes (entre ellos c++, c, makefiles, Corba IDL, > etc.) uno se pregunta si se puede automatizar m'as. > Actualmente utilizo python para parsear codigo c y c++ con ayuda de > librer'ias, para usarlos como input y generar c'odigo (c++, IDL) usando > templates, yo en particular uso JINJA2, siento que es lo suficientemente > simple para no complicar demasiado los templates, no tengo ninguna > preferencia pero me parece descente. Ahora me gustar'ia no usar templates > si no hacer un framework para facilitar la creacion de codigo c++. > La metaprogramación se usa, normalmente, para facilitar la creación y mantenimiento de código. Distinguiría algunos tipos: - abstracciones: por ejemplo, los ORMs que generan internamente código SQL (eg: alchemy) - generadores: como SIP que genera *bindings* para conectar python con librerías C/C++ - transpiladores: como typescript cuyo compilador genera código para varias versiones de javascript - macros: expansiones del lenguaje como los macros que tiene rust - DSL (*domain-specific language*): aunque no es metaprogramación, se parece. Son comunes en ruby o lua. Sin duda los transpiladores para javascript son los más usados hoy en día. Para python podría destacar coconut que puede generar código python para py2, py3 y pypy. También hay generadores de código C para crear extensiones python como cython o pyrex. > > http://lua-users.org/wiki/CppMetaprogramming #Esto es el ejemplo en lua > de metapromacion > > He usado un poco de lua para experimentar como lo muestra el link, lo cual > me parece excelente. A pesar de que lua es un gran lenguaje, la > integraci'on con algunas herramientas en mi caso espec'ifico es una labor > titanica, me pregunto si hay alguien que este haciendo algo as'i aqu'i o > conozcan algo similar para python, en cualquier lenguaje. Ahora algunas > cosas que he hecho en python en modo de experimentaci'on es definir la > estructura de mi proyecto, y el codigo que conecta todo antes de empezar a > escribir todo es auto-generado, no me tengo que preocupar de que las cosas > no esten conectadas y dise;o pruebas genericas para probar las interfaces > desde antes. > Sin ninguna duda, lua es el mejor lenguaje para metaprogramación. Desconozco qué herramientas se puedan usar con lua, pero me temo que no es un lenguaje suficientemente popular. Seguramente tengas más suerte con algún lenguaje *lispoide *como scheme o racket (mírate fulmar para racket). > Saben si esta pr'actica es com'un? me parece una forma natural de trabajar > con lenguajes est'aticos, si cambio el nombre de un archivo no me tengo que > preocupar de cambiarlo en todos los lugares donde esta referenciado, el > esqueleto del proyecto se hace al inicio y se hace m'as f'acil a;adir la > l'ogica despues, a'un tengo problemas por solucionar pero se va facilitando > con el tiempo. > > Realmente me recuerda a algunas IDEs pero con la ventaja de que es mucho > m'as personalizable. > > En mi opinión, la generación de código está bien para crear el esqueleto de un proyecto. Pero más allá, la posibilidad de regenerar el código después implica que no debe alterarse ese código generado, lo que supone una sobrecarga en la especialización de clases. En el mantenimiento son más recomendable usar las herramientas de refactorización ya incorporadas en algunos IDEs. Herramientas para generar el esqueleto de un proyecto hay muchas. Por nombrar algunas: angular-cli para aplicaciones angular, giter8 para proyectos scala o pyscaffold para python. Así mismo, muchos frameworks incluyen sus propios generadores (eg: django). Un último consejo: dale una oportunidad a rust y sus macros como alternativa a C++. Saludos. -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Wed Apr 17 18:17:44 2019 From: agtugo en gmail.com (AGTUGO) Date: Wed, 17 Apr 2019 15:17:44 -0700 Subject: [Python-es] Metaprogramando c++ con python ejemplo en lua In-Reply-To: References: Message-ID: ""En mi opinión, la generación de código está bien para crear el esqueleto de un proyecto. Pero más allá, la posibilidad de regenerar el código después implica que no debe alterarse ese código generado, lo que supone una sobrecarga en la especialización de clases. """ Este es un problema que he solucionado con tokens poniendolos en la parte donde va el codigo generado, Python busca dónde insertar código para no afectar el código ya hecho, requiere un poco de trabajo pero ha funcionado bien, el problema es que es mucho trabajo para cada caso. Tambi'en separo lo m'as que se puede del c'odigo que podr'ia ser insertado manualmente. Despu'es de investigar un poco creo que este post es la forma m'as robusta de generar codigo con python http://szelei.me/code-generator/ Usando LLVM Creo que es una idea muy elegante pero el problema no es [ python --> template --> algun_lenguaje ] sino [ algun_lenguaje ---> template ] ( no es un proceso reversible ). Lo que si se podr'ia hacer es hacer un registro que de c'odigo de bloque de jinja2 genero que parte de codigo de c++, y as'i saber donde localizar el nuevo c'odigo en el template. No es trivial pero tampoco es una odisea, adicionalmente podr'ias indicar en jinja2 secciones de "c'odigo de usario" donde normalmente se espera, as'i si alguien quiere actualizar su codigo generado esas partes jam'as se toquen y los otros "conflictos" tratar de resolverlos automaticamente de lo contrario manual. Lo malo es que la 'unica manera sin meter mucho parsing es usar tokens al inicio y final de cada parte en forma de comentario en c++ as'i python identificar'ia facilmente que parte corresponde a que //Auto-generated code file: generator.py block: block_of_inputs //Do not edit the lines below ... // End of auto-generated code file: generator.py block: block_of_inputs // User code file: generator.py block: user_logic_driver ... // End of user code file: generator.py block: user_logic_driver Pongo c++ pero podr'ia ser para cualquier lenguaje, por eso me atrevo a ponerlo aqu'i. Saludos On Wed, Apr 17, 2019, 2:53 AM Chema Cortes wrote: > > El mar., 16 abr. 2019 a las 22:43, AGTUGO () escribió: > >> Hola lista de python, >> >> Realmente no se si es offtopic, pero despu'es de auto-generar c'odigo con >> python para varios lenguajes (entre ellos c++, c, makefiles, Corba IDL, >> etc.) uno se pregunta si se puede automatizar m'as. >> Actualmente utilizo python para parsear codigo c y c++ con ayuda de >> librer'ias, para usarlos como input y generar c'odigo (c++, IDL) usando >> templates, yo en particular uso JINJA2, siento que es lo suficientemente >> simple para no complicar demasiado los templates, no tengo ninguna >> preferencia pero me parece descente. Ahora me gustar'ia no usar templates >> si no hacer un framework para facilitar la creacion de codigo c++. >> > > La metaprogramación se usa, normalmente, para facilitar la creación y > mantenimiento de código. Distinguiría algunos tipos: > > - abstracciones: por ejemplo, los ORMs que generan internamente código > SQL (eg: alchemy) > - generadores: como SIP que genera *bindings* para conectar python con > librerías C/C++ > - transpiladores: como typescript cuyo compilador genera código para > varias versiones de javascript > - macros: expansiones del lenguaje como los macros que tiene rust > - DSL (*domain-specific language*): aunque no es metaprogramación, se > parece. Son comunes en ruby o lua. > > Sin duda los transpiladores para javascript son los más usados hoy en día. > Para python podría destacar coconut que puede generar código python para > py2, py3 y pypy. También hay generadores de código C para crear extensiones > python como cython o pyrex. > > >> >> http://lua-users.org/wiki/CppMetaprogramming #Esto es el ejemplo en lua >> de metapromacion >> >> He usado un poco de lua para experimentar como lo muestra el link, lo >> cual me parece excelente. A pesar de que lua es un gran lenguaje, la >> integraci'on con algunas herramientas en mi caso espec'ifico es una labor >> titanica, me pregunto si hay alguien que este haciendo algo as'i aqu'i o >> conozcan algo similar para python, en cualquier lenguaje. Ahora algunas >> cosas que he hecho en python en modo de experimentaci'on es definir la >> estructura de mi proyecto, y el codigo que conecta todo antes de empezar a >> escribir todo es auto-generado, no me tengo que preocupar de que las cosas >> no esten conectadas y dise;o pruebas genericas para probar las interfaces >> desde antes. >> > > Sin ninguna duda, lua es el mejor lenguaje para metaprogramación. > Desconozco qué herramientas se puedan usar con lua, pero me temo que no es > un lenguaje suficientemente popular. Seguramente tengas más suerte con > algún lenguaje *lispoide *como scheme o racket (mírate fulmar para > racket). > > > >> Saben si esta pr'actica es com'un? me parece una forma natural de >> trabajar con lenguajes est'aticos, si cambio el nombre de un archivo no me >> tengo que preocupar de cambiarlo en todos los lugares donde esta >> referenciado, el esqueleto del proyecto se hace al inicio y se hace m'as >> f'acil a;adir la l'ogica despues, a'un tengo problemas por solucionar pero >> se va facilitando con el tiempo. >> >> Realmente me recuerda a algunas IDEs pero con la ventaja de que es mucho >> m'as personalizable. >> >> > En mi opinión, la generación de código está bien para crear el esqueleto > de un proyecto. Pero más allá, la posibilidad de regenerar el código > después implica que no debe alterarse ese código generado, lo que supone > una sobrecarga en la especialización de clases. En el mantenimiento son más > recomendable usar las herramientas de refactorización ya incorporadas en > algunos IDEs. > > Herramientas para generar el esqueleto de un proyecto hay muchas. Por > nombrar algunas: angular-cli para aplicaciones angular, giter8 para > proyectos scala o pyscaffold para python. Así mismo, muchos frameworks > incluyen sus propios generadores (eg: django). > > Un último consejo: dale una oportunidad a rust y sus macros como > alternativa a C++. > > Saludos. > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Sat Apr 20 10:53:55 2019 From: perysoy en gmail.com (PeRy) Date: Sat, 20 Apr 2019 16:53:55 +0200 Subject: [Python-es] Transferencia archivos grandes en socket Message-ID: Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he creado un servidor y cliente para enviar archivos. Me he dado cuenta que en archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? mi codigo: server: ============================================================================================= elif b'\F' in data: # peticion de archivo para ser descargado transmitido = data.rstrip(b'\F') comparte_dir = os.path.join(os.getcwd(), 'compartir') print(os.path.join(comparte_dir, transmitido.decode())) filesize = os.path.getsize(os.path.join(comparte_dir, transmitido.decode())) print("TAMAÑO: {}".format(filesize)) with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros 4bytes el tamaño del archivo numero_bytes = self.socket.sendfile(f) # data = f.read(8192) # numero_bytes = len(data) # self.socket.send(data) # while data: # data = f.read(8192) # self.socket.send(data) # numero_bytes += len(data) print(numero_bytes) cliente: =============================================================================================== with open(archivo, 'wb') as f: buf = socket_cliente.recv(4) # cabecera con elt amaño del archivo filesize = struct.unpack('!I', buf) print("filesize : {}".format(filesize)) filesize=filesize[0] buf = b'' tiempo_inicio = datetime.datetime.now() print(tiempo_inicio.strftime('%H:%M:%S')) while len(buf) < filesize: to_read = filesize - len(buf) buf += socket_cliente.recv(262144 if to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 updt(filesize, len(buf)) # barra de progreso f.write(buf) --------------------- Muchas Gracias y un saludo ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From diego.uribe.gamez en gmail.com Mon Apr 22 12:29:21 2019 From: diego.uribe.gamez en gmail.com (DiegoUG) Date: Mon, 22 Apr 2019 11:29:21 -0500 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola RePy Los web sockets, no son buenos para enviar archivos, es mejor para notificar, por ejemplo, lo que puedes hacer es exponer el archivo mediante una url y enviar la dirección en un mensaje de web socket, para que el cliente abra (o descargue) el archivo. [image: Mailtrack] Remitente notificado con Mailtrack 22/04/19 11:27:22 El dom., 21 de abr. de 2019 a la(s) 19:50, PeRy (perysoy en gmail.com) escribió: > > Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he > creado un servidor y cliente para enviar archivos. Me he dado cuenta que en > archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción > de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? > mi codigo: > > server: > > ============================================================================================= > elif b'\F' in data: # peticion de archivo para ser descargado > transmitido = data.rstrip(b'\F') > comparte_dir = os.path.join(os.getcwd(), 'compartir') > print(os.path.join(comparte_dir, transmitido.decode())) > filesize = os.path.getsize(os.path.join(comparte_dir, > transmitido.decode())) > print("TAMAÑO: {}".format(filesize)) > with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: > self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros > 4bytes el tamaño del archivo > numero_bytes = self.socket.sendfile(f) > # data = f.read(8192) > # numero_bytes = len(data) > # self.socket.send(data) > # while data: > # data = f.read(8192) > # self.socket.send(data) > # numero_bytes += len(data) > print(numero_bytes) > > cliente: > > =============================================================================================== > with open(archivo, 'wb') as f: > buf = socket_cliente.recv(4) # cabecera con elt > amaño del archivo > filesize = struct.unpack('!I', buf) > print("filesize : {}".format(filesize)) > filesize=filesize[0] > buf = b'' > tiempo_inicio = datetime.datetime.now() > print(tiempo_inicio.strftime('%H:%M:%S')) > while len(buf) < filesize: > to_read = filesize - len(buf) > buf += socket_cliente.recv(262144 if to_read > > 262144 else to_read) #8192 1024*8 o 4096 1024*4 > updt(filesize, len(buf)) # barra de progreso > f.write(buf) > > --------------------- > Muchas Gracias y un saludo > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- *Diego Alonso Uribe Gamez* ------------------------------ *Desarrollador web* Twitter: @DiegoUG Google+: +DiegoAlonsoUribeGamez ------------------------------ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Mon Apr 22 13:13:25 2019 From: agtugo en gmail.com (AGTUGO) Date: Mon, 22 Apr 2019 10:13:25 -0700 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Que tan grande el archivo? Cuanto es mucho tiempo? On Sun, Apr 21, 2019 at 5:50 PM PeRy wrote: > > Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he > creado un servidor y cliente para enviar archivos. Me he dado cuenta que en > archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción > de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? > mi codigo: > > server: > > ============================================================================================= > elif b'\F' in data: # peticion de archivo para ser descargado > transmitido = data.rstrip(b'\F') > comparte_dir = os.path.join(os.getcwd(), 'compartir') > print(os.path.join(comparte_dir, transmitido.decode())) > filesize = os.path.getsize(os.path.join(comparte_dir, > transmitido.decode())) > print("TAMAÑO: {}".format(filesize)) > with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: > self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros > 4bytes el tamaño del archivo > numero_bytes = self.socket.sendfile(f) > # data = f.read(8192) > # numero_bytes = len(data) > # self.socket.send(data) > # while data: > # data = f.read(8192) > # self.socket.send(data) > # numero_bytes += len(data) > print(numero_bytes) > > cliente: > > =============================================================================================== > with open(archivo, 'wb') as f: > buf = socket_cliente.recv(4) # cabecera con elt > amaño del archivo > filesize = struct.unpack('!I', buf) > print("filesize : {}".format(filesize)) > filesize=filesize[0] > buf = b'' > tiempo_inicio = datetime.datetime.now() > print(tiempo_inicio.strftime('%H:%M:%S')) > while len(buf) < filesize: > to_read = filesize - len(buf) > buf += socket_cliente.recv(262144 if to_read > > 262144 else to_read) #8192 1024*8 o 4096 1024*4 > updt(filesize, len(buf)) # barra de progreso > f.write(buf) > > --------------------- > Muchas Gracias y un saludo > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 13:25:49 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 19:25:49 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola Diego, gracias por la sugerencia, voy a leer un poco sobre el protocolo http e intentar mandarlo por http.server a ver si consigo mejores resultados. Salu2! El lun., 22 abr. 2019 a las 18:30, DiegoUG () escribió: > Hola RePy > > Los web sockets, no son buenos para enviar archivos, es mejor para > notificar, por ejemplo, lo que puedes hacer es exponer el archivo mediante > una url y enviar la dirección en un mensaje de web socket, para que el > cliente abra (o descargue) el archivo. > > > > [image: Mailtrack] > Remitente > notificado con > Mailtrack > 22/04/19 > 11:27:22 > > El dom., 21 de abr. de 2019 a la(s) 19:50, PeRy (perysoy en gmail.com) > escribió: > >> >> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >> mi codigo: >> >> server: >> >> ============================================================================================= >> elif b'\F' in data: # peticion de archivo para ser descargado >> transmitido = data.rstrip(b'\F') >> comparte_dir = os.path.join(os.getcwd(), 'compartir') >> print(os.path.join(comparte_dir, transmitido.decode())) >> filesize = os.path.getsize(os.path.join(comparte_dir, >> transmitido.decode())) >> print("TAMAÑO: {}".format(filesize)) >> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >> self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros >> 4bytes el tamaño del archivo >> numero_bytes = self.socket.sendfile(f) >> # data = f.read(8192) >> # numero_bytes = len(data) >> # self.socket.send(data) >> # while data: >> # data = f.read(8192) >> # self.socket.send(data) >> # numero_bytes += len(data) >> print(numero_bytes) >> >> cliente: >> >> =============================================================================================== >> with open(archivo, 'wb') as f: >> buf = socket_cliente.recv(4) # cabecera con elt >> amaño del archivo >> filesize = struct.unpack('!I', buf) >> print("filesize : {}".format(filesize)) >> filesize=filesize[0] >> buf = b'' >> tiempo_inicio = datetime.datetime.now() >> print(tiempo_inicio.strftime('%H:%M:%S')) >> while len(buf) < filesize: >> to_read = filesize - len(buf) >> buf += socket_cliente.recv(262144 if to_read >> > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >> updt(filesize, len(buf)) # barra de progreso >> f.write(buf) >> >> --------------------- >> Muchas Gracias y un saludo >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: +DiegoAlonsoUribeGamez > > ------------------------------ > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From alexis.roda.villalonga en gmail.com Mon Apr 22 13:31:56 2019 From: alexis.roda.villalonga en gmail.com (Alexis Roda) Date: Mon, 22 Apr 2019 19:31:56 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola, tal vez el problema es que guardas en memoria el archivo, en una cadena. Las cadenas son inmutables, eso significa que la linea "buf += socket_cliente(...)" hace algo parecido a: - reserva un nuevo bloque de memoria - copia el valor original de buf - copia el valor devuelto por la función eso en cada iteración. No escala bien. Si además el archivo es grande, en comparación con la RAM del equipo, puede ocasionar el uso de la memoria de intercambio y ralentizar las cosas aún mas. Prueba grabando en disco cada bloque según le recibes en lugar de esperar a tenerlos todos y guardar al final. Missatge de PeRy del dia dl., 22 d?abr. 2019 a les 2:50: > > Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he > creado un servidor y cliente para enviar archivos. Me he dado cuenta que en > archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción > de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? > mi codigo: > > server: > > ============================================================================================= > elif b'\F' in data: # peticion de archivo para ser descargado > transmitido = data.rstrip(b'\F') > comparte_dir = os.path.join(os.getcwd(), 'compartir') > print(os.path.join(comparte_dir, transmitido.decode())) > filesize = os.path.getsize(os.path.join(comparte_dir, > transmitido.decode())) > print("TAMAÑO: {}".format(filesize)) > with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: > self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros > 4bytes el tamaño del archivo > numero_bytes = self.socket.sendfile(f) > # data = f.read(8192) > # numero_bytes = len(data) > # self.socket.send(data) > # while data: > # data = f.read(8192) > # self.socket.send(data) > # numero_bytes += len(data) > print(numero_bytes) > > cliente: > > =============================================================================================== > with open(archivo, 'wb') as f: > buf = socket_cliente.recv(4) # cabecera con elt > amaño del archivo > filesize = struct.unpack('!I', buf) > print("filesize : {}".format(filesize)) > filesize=filesize[0] > buf = b'' > tiempo_inicio = datetime.datetime.now() > print(tiempo_inicio.strftime('%H:%M:%S')) > while len(buf) < filesize: > to_read = filesize - len(buf) > buf += socket_cliente.recv(262144 if to_read > > 262144 else to_read) #8192 1024*8 o 4096 1024*4 > updt(filesize, len(buf)) # barra de progreso > f.write(buf) > > --------------------- > Muchas Gracias y un saludo > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 13:44:00 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 19:44:00 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola! el archivo es de 400MB, la transferencia empieza a todo lo que da la PI (10-11Mb/s estoy en LAN) para después bajar a 2Mb/s y a partir de los 200Megas descargados aproximadamente va bajando progresivamente terminando en menos de 0.5Mb/s, Con otro archivo de mayor tamaño (1.6Gb) es igual, a partir de 200 megas o así va bajando hasta 0.5Mb/s y con esa velocidad hasta el final. un saludo El lun., 22 abr. 2019 a las 19:17, AGTUGO () escribió: > Que tan grande el archivo? Cuanto es mucho tiempo? > > On Sun, Apr 21, 2019 at 5:50 PM PeRy wrote: > >> >> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >> mi codigo: >> >> server: >> >> ============================================================================================= >> elif b'\F' in data: # peticion de archivo para ser descargado >> transmitido = data.rstrip(b'\F') >> comparte_dir = os.path.join(os.getcwd(), 'compartir') >> print(os.path.join(comparte_dir, transmitido.decode())) >> filesize = os.path.getsize(os.path.join(comparte_dir, >> transmitido.decode())) >> print("TAMAÑO: {}".format(filesize)) >> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >> self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros >> 4bytes el tamaño del archivo >> numero_bytes = self.socket.sendfile(f) >> # data = f.read(8192) >> # numero_bytes = len(data) >> # self.socket.send(data) >> # while data: >> # data = f.read(8192) >> # self.socket.send(data) >> # numero_bytes += len(data) >> print(numero_bytes) >> >> cliente: >> >> =============================================================================================== >> with open(archivo, 'wb') as f: >> buf = socket_cliente.recv(4) # cabecera con elt >> amaño del archivo >> filesize = struct.unpack('!I', buf) >> print("filesize : {}".format(filesize)) >> filesize=filesize[0] >> buf = b'' >> tiempo_inicio = datetime.datetime.now() >> print(tiempo_inicio.strftime('%H:%M:%S')) >> while len(buf) < filesize: >> to_read = filesize - len(buf) >> buf += socket_cliente.recv(262144 if to_read >> > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >> updt(filesize, len(buf)) # barra de progreso >> f.write(buf) >> >> --------------------- >> Muchas Gracias y un saludo >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Arturo Muñoz Tolosa > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 14:08:52 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 20:08:52 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola de nuevo Alex, sigue igual. Veo que por http la velocidad es FULL siempre, he abierto un servidor http: python -m http.server 9000 he probado a descargar un archivo y va siempre a 10-11Mb/s. Tal vez la mejor opción es tirar por ahí... pero me parece muy pesado utilizar un servidor http solo para las descargas, ¿es viable esa opción? o hay otras formas. muchas gracias a todos por su tiempo un saludo El lun., 22 abr. 2019 a las 19:42, Alexis Roda (< alexis.roda.villalonga en gmail.com>) escribió: > Hola, > tal vez el problema es que guardas en memoria el archivo, en una cadena. > Las cadenas son inmutables, eso significa que la linea "buf += > socket_cliente(...)" hace algo parecido a: > > - reserva un nuevo bloque de memoria > - copia el valor original de buf > - copia el valor devuelto por la función > > eso en cada iteración. No escala bien. Si además el archivo es grande, en > comparación con la RAM del equipo, puede ocasionar el uso de la memoria de > intercambio y ralentizar las cosas aún mas. > > Prueba grabando en disco cada bloque según le recibes en lugar de esperar > a tenerlos todos y guardar al final. > > > Missatge de PeRy del dia dl., 22 d?abr. 2019 a les > 2:50: > >> >> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >> mi codigo: >> >> server: >> >> ============================================================================================= >> elif b'\F' in data: # peticion de archivo para ser descargado >> transmitido = data.rstrip(b'\F') >> comparte_dir = os.path.join(os.getcwd(), 'compartir') >> print(os.path.join(comparte_dir, transmitido.decode())) >> filesize = os.path.getsize(os.path.join(comparte_dir, >> transmitido.decode())) >> print("TAMAÑO: {}".format(filesize)) >> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >> self.socket.send(struct.pack('!I', filesize)) # enviamos en los primeros >> 4bytes el tamaño del archivo >> numero_bytes = self.socket.sendfile(f) >> # data = f.read(8192) >> # numero_bytes = len(data) >> # self.socket.send(data) >> # while data: >> # data = f.read(8192) >> # self.socket.send(data) >> # numero_bytes += len(data) >> print(numero_bytes) >> >> cliente: >> >> =============================================================================================== >> with open(archivo, 'wb') as f: >> buf = socket_cliente.recv(4) # cabecera con elt >> amaño del archivo >> filesize = struct.unpack('!I', buf) >> print("filesize : {}".format(filesize)) >> filesize=filesize[0] >> buf = b'' >> tiempo_inicio = datetime.datetime.now() >> print(tiempo_inicio.strftime('%H:%M:%S')) >> while len(buf) < filesize: >> to_read = filesize - len(buf) >> buf += socket_cliente.recv(262144 if to_read >> > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >> updt(filesize, len(buf)) # barra de progreso >> f.write(buf) >> >> --------------------- >> Muchas Gracias y un saludo >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Mon Apr 22 14:41:15 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Mon, 22 Apr 2019 20:41:15 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Tiene toda la pinta de ser lo que te dice Alexis Roda. Piensa que cada vez que haces crecer buf (buf+=recv(...)) pasa lo siguiente: - buf apunta a obj1 en memoria - lees el dato del socket creando obj2, también en memoria - reserva el espacio para obj3 en memoria cuyo tamaño será aprox la suma de los tamaños obj1 y obj2 - copias el contenido de obj1 y obj2 sobre obj3 - buf apunta a obj3 - obj1 y obj2 pierden referencias por lo que son destruidos y vaciados de memoria Como te puedes imaginar cuanto más grande es buf más trabajo le toca hacer. La memoria se fragmenta, así que aunque creas que solo usas el resultado de la copia (y copias muchas veces) usas más memoria. Cuando llenas la memoria toca swapear (y eso es varios órdenes de magnitud más lento). Haz caso a Alexis y escribe directo a disco sin mega buffers en memoria. La parte de leer bloques ya lo estás haciendo bien. Te paso una entrada a un blog donde de propina habla de como usar sendfile para evitar copias entre kerner y memoria de usuario: http://michaldul.com/python/sendfile/ Un saludo, Javi El lun., 22 abr. 2019 a las 19:45, PeRy () escribió: > Hola! > el archivo es de 400MB, la transferencia empieza a todo lo que da la PI > (10-11Mb/s estoy en LAN) para después bajar a 2Mb/s y a partir de los > 200Megas descargados aproximadamente va bajando progresivamente terminando > en menos de 0.5Mb/s, Con otro archivo de mayor tamaño (1.6Gb) es igual, a > partir de 200 megas o así va bajando hasta 0.5Mb/s y con esa velocidad > hasta el final. > > un saludo > > El lun., 22 abr. 2019 a las 19:17, AGTUGO () escribió: > >> Que tan grande el archivo? Cuanto es mucho tiempo? >> >> On Sun, Apr 21, 2019 at 5:50 PM PeRy wrote: >> >>> >>> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >>> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >>> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >>> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >>> mi codigo: >>> >>> server: >>> >>> ============================================================================================= >>> elif b'\F' in data: # peticion de archivo para ser descargado >>> transmitido = data.rstrip(b'\F') >>> comparte_dir = os.path.join(os.getcwd(), 'compartir') >>> print(os.path.join(comparte_dir, transmitido.decode())) >>> filesize = os.path.getsize(os.path.join(comparte_dir, >>> transmitido.decode())) >>> print("TAMAÑO: {}".format(filesize)) >>> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >>> self.socket.send(struct.pack('!I', filesize)) # enviamos en los >>> primeros 4bytes el tamaño del archivo >>> numero_bytes = self.socket.sendfile(f) >>> # data = f.read(8192) >>> # numero_bytes = len(data) >>> # self.socket.send(data) >>> # while data: >>> # data = f.read(8192) >>> # self.socket.send(data) >>> # numero_bytes += len(data) >>> print(numero_bytes) >>> >>> cliente: >>> >>> =============================================================================================== >>> with open(archivo, 'wb') as f: >>> buf = socket_cliente.recv(4) # cabecera con elt >>> amaño del archivo >>> filesize = struct.unpack('!I', buf) >>> print("filesize : {}".format(filesize)) >>> filesize=filesize[0] >>> buf = b'' >>> tiempo_inicio = datetime.datetime.now() >>> print(tiempo_inicio.strftime('%H:%M:%S')) >>> while len(buf) < filesize: >>> to_read = filesize - len(buf) >>> buf += socket_cliente.recv(262144 if to_read >>> > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >>> updt(filesize, len(buf)) # barra de progreso >>> f.write(buf) >>> >>> --------------------- >>> Muchas Gracias y un saludo >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> -- >> Arturo Muñoz Tolosa >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From alexis.roda.villalonga en gmail.com Mon Apr 22 14:52:41 2019 From: alexis.roda.villalonga en gmail.com (Alexis Roda) Date: Mon, 22 Apr 2019 20:52:41 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola, ¿sigue igual después de hacer que cambios al código? Antes de que se inventara HTTP se transferían archivos, así que sí, es viable transferir con sockets a pelo. DiegoUG habla de web sockets, pero son una bestia totalmente distinta de los sockets. ¿Es HTTP una opción viable? depende del caso de uso. Prueba con estos cambios en el cliente: while len(buf) < filesize: to_read = filesize - len(buf) buf = socket_cliente.recv(262144 if to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 f.write(buf) updt(filesize, len(buf)) # barra de progreso # f.write(buf) De esta forma solo se mantiene en memoria un bloque, no el archivo entero. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 15:04:00 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 21:04:00 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola Javi, he probado de esa manera y sigue igual... paso código por si estoy haciendo algo mal: with open(archivo, 'wb') as f: buf = socket_cliente.recv(4) # cabecera con elt amaño del archivo filesize = struct.unpack('!I', buf) print("filesize : {}".format(filesize)) filesize=filesize[0] # https://stackoverflow.com/questions/42459499/what-is-the-proper-way-of-sending-a-large-amount-of-data-over-sockets-in-python/42534464 buf = b'' #for bytes_num in range(0, filesize, 1024): # updt(filesize, bytes_num+1024) tiempo_inicio = datetime.datetime.now() print(tiempo_inicio.strftime('%H:%M:%S')) while len(buf) < filesize: to_read = filesize - len(buf) tiempo_descarga_inicio = datetime.datetime.now() recibido = socket_cliente.recv(262144 if to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 buf += recibido # buf es el total recibido tiempo_descarga_final = datetime.datetime.now() tiempo_diferencia_descarga = tiempo_descarga_final - tiempo_descarga_inicio a = tiempo_diferencia_descarga.total_seconds() try: speed_transfer = ('{:.2f}MB/s'.format((len(recibido)/a)/1000000)) # a MByte updt(filesize, len(buf), speed_transfer) except ZeroDivisionError: pass f.write(recibido) <------------------ Escribo lo recibido en cada pasada Como le comenté al anterior compañero, si creo un server http con python -m http.server 9000 y descargo algo va a tope 10-11mb todo el rato tal vez tendría que probar con socketserver? https://docs.python.org/3/library/socketserver.html#socketserver.TCPServer Gracias y Saludos. El lun., 22 abr. 2019 a las 20:43, lasizoillo () escribió: > Tiene toda la pinta de ser lo que te dice Alexis Roda. Piensa que cada vez > que haces crecer buf (buf+=recv(...)) pasa lo siguiente: > - buf apunta a obj1 en memoria > - lees el dato del socket creando obj2, también en memoria > - reserva el espacio para obj3 en memoria cuyo tamaño será aprox la suma > de los tamaños obj1 y obj2 > - copias el contenido de obj1 y obj2 sobre obj3 > - buf apunta a obj3 > - obj1 y obj2 pierden referencias por lo que son destruidos y vaciados de > memoria > > Como te puedes imaginar cuanto más grande es buf más trabajo le toca > hacer. La memoria se fragmenta, así que aunque creas que solo usas el > resultado de la copia (y copias muchas veces) usas más memoria. Cuando > llenas la memoria toca swapear (y eso es varios órdenes de magnitud más > lento). > > Haz caso a Alexis y escribe directo a disco sin mega buffers en memoria. > La parte de leer bloques ya lo estás haciendo bien. > > Te paso una entrada a un blog donde de propina habla de como usar sendfile > para evitar copias entre kerner y memoria de usuario: > http://michaldul.com/python/sendfile/ > > Un saludo, > > Javi > > El lun., 22 abr. 2019 a las 19:45, PeRy () escribió: > >> Hola! >> el archivo es de 400MB, la transferencia empieza a todo lo que da la PI >> (10-11Mb/s estoy en LAN) para después bajar a 2Mb/s y a partir de los >> 200Megas descargados aproximadamente va bajando progresivamente terminando >> en menos de 0.5Mb/s, Con otro archivo de mayor tamaño (1.6Gb) es igual, a >> partir de 200 megas o así va bajando hasta 0.5Mb/s y con esa velocidad >> hasta el final. >> >> un saludo >> >> El lun., 22 abr. 2019 a las 19:17, AGTUGO () escribió: >> >>> Que tan grande el archivo? Cuanto es mucho tiempo? >>> >>> On Sun, Apr 21, 2019 at 5:50 PM PeRy wrote: >>> >>>> >>>> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >>>> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >>>> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >>>> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >>>> mi codigo: >>>> >>>> server: >>>> >>>> ============================================================================================= >>>> elif b'\F' in data: # peticion de archivo para ser descargado >>>> transmitido = data.rstrip(b'\F') >>>> comparte_dir = os.path.join(os.getcwd(), 'compartir') >>>> print(os.path.join(comparte_dir, transmitido.decode())) >>>> filesize = os.path.getsize(os.path.join(comparte_dir, >>>> transmitido.decode())) >>>> print("TAMAÑO: {}".format(filesize)) >>>> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >>>> self.socket.send(struct.pack('!I', filesize)) # enviamos en los >>>> primeros 4bytes el tamaño del archivo >>>> numero_bytes = self.socket.sendfile(f) >>>> # data = f.read(8192) >>>> # numero_bytes = len(data) >>>> # self.socket.send(data) >>>> # while data: >>>> # data = f.read(8192) >>>> # self.socket.send(data) >>>> # numero_bytes += len(data) >>>> print(numero_bytes) >>>> >>>> cliente: >>>> >>>> =============================================================================================== >>>> with open(archivo, 'wb') as f: >>>> buf = socket_cliente.recv(4) # cabecera con >>>> elt amaño del archivo >>>> filesize = struct.unpack('!I', buf) >>>> print("filesize : {}".format(filesize)) >>>> filesize=filesize[0] >>>> buf = b'' >>>> tiempo_inicio = datetime.datetime.now() >>>> print(tiempo_inicio.strftime('%H:%M:%S')) >>>> while len(buf) < filesize: >>>> to_read = filesize - len(buf) >>>> buf += socket_cliente.recv(262144 if >>>> to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >>>> updt(filesize, len(buf)) # barra de >>>> progreso >>>> f.write(buf) >>>> >>>> --------------------- >>>> Muchas Gracias y un saludo >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> >>> >>> -- >>> Arturo Muñoz Tolosa >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 15:13:23 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 21:13:23 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola de nuevo Javi, Vale ya lo tengo... no era solo escribir lo recibido en cada pasada sino quitar los buff+= muchas gracias a todos por vuestro tiempo! El lun., 22 abr. 2019 a las 20:43, lasizoillo () escribió: > Tiene toda la pinta de ser lo que te dice Alexis Roda. Piensa que cada vez > que haces crecer buf (buf+=recv(...)) pasa lo siguiente: > - buf apunta a obj1 en memoria > - lees el dato del socket creando obj2, también en memoria > - reserva el espacio para obj3 en memoria cuyo tamaño será aprox la suma > de los tamaños obj1 y obj2 > - copias el contenido de obj1 y obj2 sobre obj3 > - buf apunta a obj3 > - obj1 y obj2 pierden referencias por lo que son destruidos y vaciados de > memoria > > Como te puedes imaginar cuanto más grande es buf más trabajo le toca > hacer. La memoria se fragmenta, así que aunque creas que solo usas el > resultado de la copia (y copias muchas veces) usas más memoria. Cuando > llenas la memoria toca swapear (y eso es varios órdenes de magnitud más > lento). > > Haz caso a Alexis y escribe directo a disco sin mega buffers en memoria. > La parte de leer bloques ya lo estás haciendo bien. > > Te paso una entrada a un blog donde de propina habla de como usar sendfile > para evitar copias entre kerner y memoria de usuario: > http://michaldul.com/python/sendfile/ > > Un saludo, > > Javi > > El lun., 22 abr. 2019 a las 19:45, PeRy () escribió: > >> Hola! >> el archivo es de 400MB, la transferencia empieza a todo lo que da la PI >> (10-11Mb/s estoy en LAN) para después bajar a 2Mb/s y a partir de los >> 200Megas descargados aproximadamente va bajando progresivamente terminando >> en menos de 0.5Mb/s, Con otro archivo de mayor tamaño (1.6Gb) es igual, a >> partir de 200 megas o así va bajando hasta 0.5Mb/s y con esa velocidad >> hasta el final. >> >> un saludo >> >> El lun., 22 abr. 2019 a las 19:17, AGTUGO () escribió: >> >>> Que tan grande el archivo? Cuanto es mucho tiempo? >>> >>> On Sun, Apr 21, 2019 at 5:50 PM PeRy wrote: >>> >>>> >>>> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he >>>> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en >>>> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción >>>> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar? >>>> mi codigo: >>>> >>>> server: >>>> >>>> ============================================================================================= >>>> elif b'\F' in data: # peticion de archivo para ser descargado >>>> transmitido = data.rstrip(b'\F') >>>> comparte_dir = os.path.join(os.getcwd(), 'compartir') >>>> print(os.path.join(comparte_dir, transmitido.decode())) >>>> filesize = os.path.getsize(os.path.join(comparte_dir, >>>> transmitido.decode())) >>>> print("TAMAÑO: {}".format(filesize)) >>>> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f: >>>> self.socket.send(struct.pack('!I', filesize)) # enviamos en los >>>> primeros 4bytes el tamaño del archivo >>>> numero_bytes = self.socket.sendfile(f) >>>> # data = f.read(8192) >>>> # numero_bytes = len(data) >>>> # self.socket.send(data) >>>> # while data: >>>> # data = f.read(8192) >>>> # self.socket.send(data) >>>> # numero_bytes += len(data) >>>> print(numero_bytes) >>>> >>>> cliente: >>>> >>>> =============================================================================================== >>>> with open(archivo, 'wb') as f: >>>> buf = socket_cliente.recv(4) # cabecera con >>>> elt amaño del archivo >>>> filesize = struct.unpack('!I', buf) >>>> print("filesize : {}".format(filesize)) >>>> filesize=filesize[0] >>>> buf = b'' >>>> tiempo_inicio = datetime.datetime.now() >>>> print(tiempo_inicio.strftime('%H:%M:%S')) >>>> while len(buf) < filesize: >>>> to_read = filesize - len(buf) >>>> buf += socket_cliente.recv(262144 if >>>> to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 >>>> updt(filesize, len(buf)) # barra de >>>> progreso >>>> f.write(buf) >>>> >>>> --------------------- >>>> Muchas Gracias y un saludo >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> >>> >>> -- >>> Arturo Muñoz Tolosa >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From perysoy en gmail.com Mon Apr 22 15:44:54 2019 From: perysoy en gmail.com (PeRy) Date: Mon, 22 Apr 2019 21:44:54 +0200 Subject: [Python-es] Transferencia archivos grandes en socket In-Reply-To: References: Message-ID: Hola Alexis, despues de eliminar el buf+= y escribir directamente lo recibido en el momento ya me funciona a tope!! asi se me queda el codigo while filesize: to_read = filesize - len(buf) tiempo_descarga_inicio = datetime.datetime.now() recibido = socket_cliente.recv(262144 if to_read > 262144 else to_read) #8192 1024*8 o 4096 1024*4 #buf += recibido # buf es el total recibido tiempo_descarga_final = datetime.datetime.now() tiempo_diferencia_descarga = tiempo_descarga_final - tiempo_descarga_inicio a = tiempo_diferencia_descarga.total_seconds() try: speed_transfer = ('{:.2f}MB/s'.format((len(recibido)/a)/1000000)) # a MByte updt(filesize, progreso, speed_transfer) <---- tengo que averiguar como sacar el progreso de lo recibido except ZeroDivisionError: pass filesize -=len(recibido) f.write(recibido) tiempo_final = datetime.datetime.now() print( tiempo_final.strftime('%H:%M:%S')) diferencia_tiempo = tiempo_final - tiempo_inicio print('{:.2f} segundos'.format(diferencia_tiempo.total_seconds())) # typo float muchisimas gracias por vuestro tiempo! un saludo! El lun., 22 abr. 2019 a las 21:16, Alexis Roda (< alexis.roda.villalonga en gmail.com>) escribió: > Hola, > ¿sigue igual después de hacer que cambios al código? > > Antes de que se inventara HTTP se transferían archivos, así que sí, es > viable transferir con sockets a pelo. DiegoUG habla de web sockets, pero > son una bestia totalmente distinta de los sockets. > > ¿Es HTTP una opción viable? depende del caso de uso. > > Prueba con estos cambios en el cliente: > > while len(buf) < filesize: > to_read = filesize - len(buf) > buf = socket_cliente.recv(262144 if to_read > > 262144 else to_read) #8192 1024*8 o 4096 1024*4 > f.write(buf) > updt(filesize, len(buf)) # barra de progreso > # f.write(buf) > > De esta forma solo se mantiene en memoria un bloque, no el archivo entero. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Pedro Luis Gavira Garcia Transitario - Comercio Exterior - Aduanas Transitarios de Ciudad Real pedroluis en transitarioscr.com http://www.aduanasciudadreal.com.es/ Tlfno. +34 647 426 639 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Thu Apr 25 22:39:11 2019 From: agtugo en gmail.com (AGTUGO) Date: Thu, 25 Apr 2019 19:39:11 -0700 Subject: [Python-es] Es coconut solamente azucar sintactico? Message-ID: Perdon la traduccion de syntatic sugar pero es lo que se me ocurri'o. Lo que mas esperaba de coconut es verificaci'on de tipos en funciones, no hay. El objetivo es escribir mas claro el programa con estilo funcional? Aveces uso decoradores para revisar los tipos, solamente cuando es necesario pensaba que coconut podria ahorrarme la molestia. -- Arturo Muñoz ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Fri Apr 26 05:53:29 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Fri, 26 Apr 2019 11:53:29 +0200 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: El vie., 26 abr. 2019 a las 4:39, AGTUGO () escribió: > Perdon la traduccion de syntatic sugar pero es lo que se me ocurri'o. Lo > que mas esperaba de coconut es verificaci'on de tipos en funciones, no hay. > El objetivo es escribir mas claro el programa con estilo funcional? Aveces > uso decoradores para revisar los tipos, solamente cuando es necesario > pensaba que coconut podria ahorrarme la molestia. > > Yo no lo consideraría como *syntatic sugar*. Aunque opcional, puedes activar el modo estricto y las comprobaciones de tipos con mypy. Lo único a tener en cuenta es que la versión de python objetivo (*target*) debe tener soporte para notación de tipos para que mypy lo procese. O sea, debes usar un target superior a 3 en lugar del target universal que usa por defecto: https://coconut.readthedocs.io/en/latest/DOCS.html#allowable-targets Aunque no necesitas coconut. Para chequear tipos puedes usar algún linter con mypy en el IDE que uses (por ejemplo, visual code con pylama). Por seguir con coconut, tiene comprobación de patrones, tanto en asignación como en definición de función. Por ejemplo, se puede definir la función factorial como: def factorial(0) = 1 @addpattern(factorial)def factorial(n is int if n > 0) = range(1, n+1) |> reduce$(*) No tienen *returns*, casi podría decirse que son funciones lambdas. Pero implícitamente saldrá un error si el argumento no es cero o un entero positivo, por lo que hace bastante más que una simple función lambda. Por otro lado, el reduce se está aplicando parcialmente con el operador multiplicación. Se podría hacer igual con reduce, partial y mul que puedes "rescatar" de algunos módulos donde han sido exiliados en python. Pero en coconut son entidades de primer orden que, además, puedes combinar con otras inexistentes en python como la evaluación perezosa de listas (lazy lists) o el procesamiento paralelo (útil en monads). Saludos. -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From faltet en gmail.com Fri Apr 26 12:02:03 2019 From: faltet en gmail.com (Francesc Alted) Date: Fri, 26 Apr 2019 18:02:03 +0200 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: Yo también me alegro que los lenguajes funcionales se empiecen a tomar en serio en ámbitos cada vez más amplios. No acabo de estar totalmente con Chema cuando dice en su blog que las construcciones funcionales estan siendo arrinconcadas en Python; personalmente, uso mucho los iteradores/generadores, que estan considerados como constructos funcionales, y que creo que estan en la base de muchas librerias Python. De todas maneras habrá que seguir con mucho interés a Chema en lo que se prevé como una prometedora serie de artículos sobre coconut en su blog: https://blog.ch3m4.org/2019/04/16/que-es-un-coconut/ (aunque esperemos que las apariciones de Enrique y Ana no se prodiguen demasiado ;-) Saludos! Missatge de Chema Cortes del dia dv., 26 d?abr. 2019 a les 11:54: > > El vie., 26 abr. 2019 a las 4:39, AGTUGO () escribió: > >> Perdon la traduccion de syntatic sugar pero es lo que se me ocurri'o. Lo >> que mas esperaba de coconut es verificaci'on de tipos en funciones, no hay. >> El objetivo es escribir mas claro el programa con estilo funcional? Aveces >> uso decoradores para revisar los tipos, solamente cuando es necesario >> pensaba que coconut podria ahorrarme la molestia. >> >> > Yo no lo consideraría como *syntatic sugar*. Aunque opcional, puedes > activar el modo estricto y las comprobaciones de tipos con mypy. Lo único a > tener en cuenta es que la versión de python objetivo (*target*) debe > tener soporte para notación de tipos para que mypy lo procese. O sea, debes > usar un target superior a 3 en lugar del target universal que usa por > defecto: > > https://coconut.readthedocs.io/en/latest/DOCS.html#allowable-targets > > Aunque no necesitas coconut. Para chequear tipos puedes usar algún linter > con mypy en el IDE que uses (por ejemplo, visual code con pylama). > > > Por seguir con coconut, tiene comprobación de patrones, tanto en > asignación como en definición de función. Por ejemplo, se puede definir la > función factorial como: > > def factorial(0) = 1 > @addpattern(factorial)def factorial(n is int if n > 0) = > range(1, n+1) |> reduce$(*) > > No tienen *returns*, casi podría decirse que son funciones lambdas. Pero > implícitamente saldrá un error si el argumento no es cero o un entero > positivo, por lo que hace bastante más que una simple función lambda. > > Por otro lado, el reduce se está aplicando parcialmente con el operador > multiplicación. Se podría hacer igual con reduce, partial y mul que puedes > "rescatar" de algunos módulos donde han sido exiliados en python. Pero en > coconut son entidades de primer orden que, además, puedes combinar con > otras inexistentes en python como la evaluación perezosa de listas (lazy > lists) o el procesamiento paralelo (útil en monads). > > > Saludos. > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nimbiotics en gmail.com Fri Apr 26 14:56:00 2019 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Fri, 26 Apr 2019 14:56:00 -0400 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: ¿Me pueden informar cuál es el blog de Chema? Dtb/Gby ======= Mario R. Osorio B.A.S. of Information Technology Web page: *http;//mario.osorio.solutions * Email: *mario en osorio.solutions* *Just Choose Python!* *SQL programmers don't die, they just ROLLBACK the TRANSACTION.* On Fri, Apr 26, 2019 at 12:14 PM Francesc Alted wrote: > Yo también me alegro que los lenguajes funcionales se empiecen a tomar en > serio en ámbitos cada vez más amplios. No acabo de estar totalmente con > Chema cuando dice en su blog que las construcciones funcionales estan > siendo arrinconcadas en Python; personalmente, uso mucho los > iteradores/generadores, que estan considerados como constructos > funcionales, y que creo que estan en la base de muchas librerias Python. > > De todas maneras habrá que seguir con mucho interés a Chema en lo que se > prevé como una prometedora serie de artículos sobre coconut en su blog: > https://blog.ch3m4.org/2019/04/16/que-es-un-coconut/ (aunque esperemos > que las apariciones de Enrique y Ana no se prodiguen demasiado ;-) > > Saludos! > > Missatge de Chema Cortes del dia dv., 26 d?abr. 2019 > a les 11:54: > >> >> El vie., 26 abr. 2019 a las 4:39, AGTUGO () escribió: >> >>> Perdon la traduccion de syntatic sugar pero es lo que se me ocurri'o. Lo >>> que mas esperaba de coconut es verificaci'on de tipos en funciones, no hay. >>> El objetivo es escribir mas claro el programa con estilo funcional? Aveces >>> uso decoradores para revisar los tipos, solamente cuando es necesario >>> pensaba que coconut podria ahorrarme la molestia. >>> >>> >> Yo no lo consideraría como *syntatic sugar*. Aunque opcional, puedes >> activar el modo estricto y las comprobaciones de tipos con mypy. Lo único a >> tener en cuenta es que la versión de python objetivo (*target*) debe >> tener soporte para notación de tipos para que mypy lo procese. O sea, debes >> usar un target superior a 3 en lugar del target universal que usa por >> defecto: >> >> https://coconut.readthedocs.io/en/latest/DOCS.html#allowable-targets >> >> Aunque no necesitas coconut. Para chequear tipos puedes usar algún linter >> con mypy en el IDE que uses (por ejemplo, visual code con pylama). >> >> >> Por seguir con coconut, tiene comprobación de patrones, tanto en >> asignación como en definición de función. Por ejemplo, se puede definir la >> función factorial como: >> >> def factorial(0) = 1 >> @addpattern(factorial)def factorial(n is int if n > 0) = >> range(1, n+1) |> reduce$(*) >> >> No tienen *returns*, casi podría decirse que son funciones lambdas. Pero >> implícitamente saldrá un error si el argumento no es cero o un entero >> positivo, por lo que hace bastante más que una simple función lambda. >> >> Por otro lado, el reduce se está aplicando parcialmente con el operador >> multiplicación. Se podría hacer igual con reduce, partial y mul que puedes >> "rescatar" de algunos módulos donde han sido exiliados en python. Pero en >> coconut son entidades de primer orden que, además, puedes combinar con >> otras inexistentes en python como la evaluación perezosa de listas (lazy >> lists) o el procesamiento paralelo (útil en monads). >> >> >> Saludos. >> >> >> -- >> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >> https://blog.ch3m4.org >> Buscador Python Hispano: http://busca.ch3m4.org >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Francesc Alted > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Apr 27 11:34:59 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 27 Apr 2019 17:34:59 +0200 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: El sáb., 27 abr. 2019 a las 4:08, Mario R. Osorio () escribió: > ¿Me pueden informar cuál es el blog de Chema? > https://blog.ch3m4.org Lo pongo al final de los mensajes ? -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Apr 27 13:02:51 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 27 Apr 2019 19:02:51 +0200 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: El vie., 26 abr. 2019 a las 18:14, Francesc Alted () escribió: > Yo también me alegro que los lenguajes funcionales se empiecen a tomar en > serio en ámbitos cada vez más amplios. No acabo de estar totalmente con > Chema cuando dice en su blog que las construcciones funcionales estan > siendo arrinconcadas en Python; personalmente, uso mucho los > iteradores/generadores, que estan considerados como constructos > funcionales, y que creo que estan en la base de muchas librerias Python. > Como siempre digo, los paradigmas en programación depende de la actitud del programador. El lenguaje ayuda bastante, pero es el programador quién hace el esfuerzo. Efectivamente, los iteradores/generadores son el fundamento de muchas librerías y su uso debería ser obligado. Pero si usas un iterador para crear otro al puro estilo funcional, ¿se puede evitar que un error interrumpa la cadena de iteradores? ¿se podrían paralelizar (incluso ignorando que existe GIL)? Para la primera pregunta, no he visto cómo. Para la segunda, Futures. En mi blog hablaba en pasado. Hoy en día, todos los lenguajes se ven obligados a introducir características funcionales, incluso java. Pero visto lo que se ha tardado en dejar atrás python2, reconozco que se me agota la paciencia. > De todas maneras habrá que seguir con mucho interés a Chema en lo que se > prevé como una prometedora serie de artículos sobre coconut en su blog: > https://blog.ch3m4.org/2019/04/16/que-es-un-coconut/ (aunque esperemos > que las apariciones de Enrique y Ana no se prodiguen demasiado ;-) > Prometo que será la última aparición de Enrique y Ana :-P -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jhmorenof en gmail.com Mon Apr 29 05:58:48 2019 From: jhmorenof en gmail.com (jhmorenof) Date: Mon, 29 Apr 2019 07:58:48 -0200 Subject: [Python-es] FW (1): q1 Message-ID: <2B488AF2-95EA-4CB8-B93B-0138EAA7880A@gmail.com> View message... ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From faltet en gmail.com Mon Apr 29 08:51:30 2019 From: faltet en gmail.com (Francesc Alted) Date: Mon, 29 Apr 2019 14:51:30 +0200 Subject: [Python-es] Es coconut solamente azucar sintactico? In-Reply-To: References: Message-ID: Missatge de Chema Cortes del dia ds., 27 d?abr. 2019 a les 19:03: > > El vie., 26 abr. 2019 a las 18:14, Francesc Alted () > escribió: > >> Yo también me alegro que los lenguajes funcionales se empiecen a tomar en >> serio en ámbitos cada vez más amplios. No acabo de estar totalmente con >> Chema cuando dice en su blog que las construcciones funcionales estan >> siendo arrinconcadas en Python; personalmente, uso mucho los >> iteradores/generadores, que estan considerados como constructos >> funcionales, y que creo que estan en la base de muchas librerias Python. >> > > Como siempre digo, los paradigmas en programación depende de la actitud > del programador. El lenguaje ayuda bastante, pero es el programador quién > hace el esfuerzo. > > Efectivamente, los iteradores/generadores son el fundamento de muchas > librerías y su uso debería ser obligado. Pero si usas un iterador para > crear otro al puro estilo funcional, ¿se puede evitar que un error > interrumpa la cadena de iteradores? ¿se podrían paralelizar (incluso > ignorando que existe GIL)? > > > Para la primera pregunta, no he visto cómo. Para la segunda, Futures. > Bueno, para el paralelismo (sin GIL), también existe el módulo multiprocessing ( https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool.imap); hay muchas variantes de uso, como por ejemplo: http://www.grantjenks.com/wiki/random/python_multiprocessing_lazy_iterating_map. Aunque lanzar un proceso por cada worker parezca muy caro, no lo es tanto (unos 35 us en Linux, como se puede ver en: https://eli.thegreenplace.net/2018/launching-linux-threads-and-processes-with-clone/ ). Y si, para la primera no habia caido, pero es verdad que tampoco hago demasiado uso de cadenas de iteradores. > > En mi blog hablaba en pasado. Hoy en día, todos los lenguajes se ven > obligados a introducir características funcionales, incluso java. Pero > visto lo que se ha tardado en dejar atrás python2, reconozco que se me > agota la paciencia. > > >> De todas maneras habrá que seguir con mucho interés a Chema en lo que se >> prevé como una prometedora serie de artículos sobre coconut en su blog: >> https://blog.ch3m4.org/2019/04/16/que-es-un-coconut/ (aunque esperemos >> que las apariciones de Enrique y Ana no se prodiguen demasiado ;-) >> > > Prometo que será la última aparición de Enrique y Ana :-P > Se agradece (aunque he de confesar que, como tú, soy de la generación que creció viéndolos en la tele; pero creo que, o ellos o yo hemos envejecido mal :-) Francesc > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From mlacunza en gmail.com Mon Apr 29 14:00:26 2019 From: mlacunza en gmail.com (Mario Lacunza) Date: Mon, 29 Apr 2019 13:00:26 -0500 Subject: [Python-es] FW (1): q1 In-Reply-To: <2B488AF2-95EA-4CB8-B93B-0138EAA7880A@gmail.com> References: <2B488AF2-95EA-4CB8-B93B-0138EAA7880A@gmail.com> Message-ID: Alguien puede dar de baja a este spammer? Saludos / Best regards Mario Lacunza Email:: mlacunza en gmail.com Personal Website:: http://www.lacunza.biz/ Hosting:: http://mlv-host.com/ Skype: mlacunzav Lima - Peru El lun., 29 de abr. de 2019 a la(s) 05:19, jhmorenof (jhmorenof en gmail.com) escribió: > Click here! > > > > > > > > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Tue Apr 30 15:05:49 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Tue, 30 Apr 2019 21:05:49 +0200 Subject: [Python-es] FW (1): q1 In-Reply-To: References: <2B488AF2-95EA-4CB8-B93B-0138EAA7880A@gmail.com> Message-ID: El lun., 29 abr. 2019 a las 20:01, Mario Lacunza () escribió: > Alguien puede dar de baja a este spammer? > Hecho. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: