[Python] Domande sulla xmlrpclib.ServerProxy e sugli unittest
Ciao a tutti, avrei due domande da sottoporre a questo nobile convivio di serpidi La risposta al Vs. buon cuore In ogni caso, grazie :-) 1. E' possibile dotare la xmlrpclib.ServerProxy di un timeout senza: - dover estendere le classi httplib.HTTPConnection, httplib.HTTP e xmlrpclib.Transport. (come fatto sul file xmlrpc.py in allegato) - usare la socket.setdefaulttimeout() sarebbe semplice, ma non posso permettermelo: il programma è multi-thread ed usa le socket anche per altro. Inserire dei lock per sincronizzare il tutto mi sembra molto più "brutto" della soluzione che ho trovato. - usare le Twisted: il programma client è multi-thread, cambiarlo tutto ora è fuori questione (anche se ci sto pensando) Insomma, ho cercato su internet e non ho trovato di meglio di questo, ma mi sembra complesso e poco pulito. I miei sensi di ragno vibrano, sento odore di bugs ... ho "perso un pezzo"? (aka: c'è una via semplice?) ... qualcuno ha un'idea migliore o diversa? 2. Sui test in allegato Dovendo testare il funzionamento di un oggetto di questo genere (client-server) il modo che ho utilizzato mi sembra troppo complesso e propenso a generare ad errori (soprattutto su s.o. diversi). Dato che per poter testare _funzionalmente_ un server devo istanziarlo in un thread/processo diverso e provare ad accedervi, non ho trovato un metodo più semplice che istanziarlo nel setUp() e rimuoverlo nel tearDown(). La libreria "nose" http://somethingaboutorange.com/mrl/projects/nose/ risolve il problema: permette di definire un setUp e tearDown a livello di modulo e di classe. Mi domandavo se esiste un metodo per fare ciò con le librerie "standard" in maniera pulita. Nota per i puristi dei test unitari. A dispetto dell'utilizzo del modulo "unittest", i test in allegato non sono unitari ma funzionali: testano il funzionamento complessivo, non di una sua piccola parte. Ed è proprio quello che volevo fare ;-) Scusate la lunghezza, Roberto p.s. --- Perchè tanta sofferenza? --- Il dettaglio per i curiosi :-) Il problema che il codice in allegato deve risolvere è di base semplice: fornire la libreria per effettuare una chiamata XML-RPC, però sono dati questi vincoli - sia il client che il server possono essere bloccati da "eventi non prevedibili", ma non si devono mai bloccare reciprocamente per un tempo indefinito. - il codice deve funzionare su s.o. diversi. - il client può essere invocato da un ambiente multi-thread In particolare: - il server accede a dei DB in rete, i suoi tempi di risposta possono variare considerevolmente. - il codice client è utilizzato da diversi processi e/o Thread, su s.o. diversi, alcuni dei quali comunicano su connessioni che possono staccarsi in ogni momento senza inviare la chiusura TCP (es: connessioni da cellulare). Il server o il client se ne possono accorgere solo con un timeout di qualche tipo. #!/usr/bin/env python __author__="Roberto Bettazzoni" import socket ### XML-RPC Server from SimpleXMLRPCServer import SimpleXMLRPCServer class XMLRPCServer(SimpleXMLRPCServer): """ Server XML-RPC Su 'host' diventano disponibili tutti i metodi non privati dell'istanza 'publicMethods_instance'. La chiamata viene gestita sincronamente, con il timeout 'recv_socket_timeout' sulla socket di ricezione (nessun chiamante puo' bloccare con l'invio il server per piu' di quei secondi, di default 1.0) """ def __init__(self, host , publicMethods_instance, recv_socket_timeout=1.0): SimpleXMLRPCServer.__init__(self, host) self.register_instance(publicMethods_instance) self.recv_socket_timeout = recv_socket_timeout def server_bind(self): self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) SimpleXMLRPCServer.server_bind(self) def handle_request(self): """Handle one request, possibly blocking.""" try: request, client_address = self.get_request() except socket.error: return if self.verify_request(request, client_address): try: self.process_request(request, client_address) except socket.timeout: self.close_request(request) except: self.handle_error(request, client_address) self.close_request(request) def get_request(self): while 1: try: sock, addr = self.socket.accept() sock.settimeout(self.recv_socket_timeout) return (sock, addr) except socket.timeout: pass ### XML-RPC Client import xmlrpclib, httplib class TimeoutedHTTPConnection(httplib.HTTPConnection): connection_timeout = None def connect(self): """override of the standard lib. original comment: Connect to the host and port specified in __init__.""" msg = "getaddrinfo returns an empty list" for res in socket.getad
[Python] compilare python
Salve. Esiste un sistema per compilare uno script python sotto linux? Non so se è una domanda stupida perchè sono un neofita. Abbiate pazienza.___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 8/24/07, Simone <[EMAIL PROTECTED]> wrote: > > Salve. Esiste un sistema per compilare uno script python sotto linux? > Non so se è una domanda stupida perchè sono un neofita. Abbiate > pazienza. Ciao, non capisco bene la tua domanda, cosa intendi per compilare uno script sotto linux? Sei un neofita di python o di linux? :-) Se hai un file script_di_prova.py, e hai installato python (quasi tutte, se non tutte le distribuzioni lo dovrebbero avere giò installato), dal tuo prompt ti basta fare: python script_di_prova.py e premere invio... e questo eseguirà il tuo script. Naturalmente, se non hai python o se non è aggiornato o... ci sono mille altri motivi per cui potresti volerlo fare, hai sempre l'opzione di prendere l'apposito package (ad esempio rpm) oppure scaricare i sorgenti e compilarlo ex novo (se sei un neofita di linux impareresti un sacco a farlo, non è così difficile...) Se invece ho capito male la tua domanda, prova a rifarla magari indicando cosa hai già provato a fare e cosa non ha funzionato come ti aspettavi... ciao, Francesco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
Per compilarlo e ottenere un modulo in byte code devi fare da shell py_compilefiles script.py dopo di che con python sript.pyc esegui il modulo > > Ciao, > > non capisco bene la tua domanda, cosa intendi per compilare uno script > sotto linux? Sei un neofita di python o di linux? :-) > -- -Massimiliano Giovine Aksel Peter Jørgensen dice: "Why make things difficult, when it is possible to make them cryptic and totally illogic, with just a little bit more effort?" ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 24/ago/07, at 18:41, Francesco Guerrieri wrote: non capisco bene la tua domanda, cosa intendi per compilare uno script sotto linux? Sei un neofita di python o di linux? :-) La domanda è purtroppo ambigua, hai ragione. Io credo che pensando a linguaggi come il C intendesse in quel senso 'compilato'. Allora facciamo un piccolo pistolotto. Python viene compilato in modo trasparente in un bytecode che è poi interpretato dalla macchina virtuale Python. Ci sono altre implementazioni di Python che hanno per target la JVM (vecchio python però, e temo anche vecchia VM) e .Net (IronPython può avere per target .Net, ma credo anche mono). Python è compilato? Si. Python è compilato in codice nativo? No. Python ha bisogno di un qualche interprete di bytecode? Si. Non sto trattando pypy. (quasi tutte, se non tutte le distribuzioni lo dovrebbero avere giò installato), Direi che le maggiori lo hanno di default RedHat e derivate lo usano per roba di sistema, quindi c'è. Ubuntu pure. Non so Deb e SuSE, per dire. Deb la installo normalmente minimale e poi aggiungo (e nella minimale mi sa che non c'è). SuSE è una vita che non la provo. (se sei un neofita di linux impareresti un sacco a farlo, non è così difficile...) Imparerebbe a scrivere nel terminale ./configure && make && sudo make install... :) -enrico ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 8/24/07, Massimiliano Giovine <[EMAIL PROTECTED]> wrote: > > Per compilarlo e ottenere un modulo in byte code devi fare da shell > > py_compilefiles script.py > > dopo di che con > > python sript.pyc > > esegui il modulo Ok, se è questo quello che intendeva allora potrebbe essere utile anche il modulo py_compile: http://www.python.org/doc/2.2.1/lib/module-pycompile.html >Aksel Peter Jørgensen dice: "Why make things difficult, when it is > possible to make them cryptic and totally illogic, with just a little > bit more effort?" bella citazione :-) ciao, francesco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 8/24/07, Enrico Franchi <[EMAIL PROTECTED]> wrote: > > > > Imparerebbe a scrivere nel terminale ./configure && make && sudo make > install... :) > > -enrico > E ti sembra poco prendere confidenza con il terminale? :-) e anche abituarsi a leggere i readme, a controllare il make.sys, a sistemare qualche dipendenza... ciao francesco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
Il giorno 24/ago/07, alle ore 20:13, [EMAIL PROTECTED] ha scritto: Ciao, non capisco bene la tua domanda, cosa intendi per compilare uno script sotto linux? Sei un neofita di python o di linux? :-) Di python Intendo compilare come avviene con il C, ma va benissimo il discorso del modulo in bytecode. Se invece ho capito male la tua domanda, prova a rifarla magari indicando cosa hai già provato a fare e cosa non ha funzionato come ti aspettavi... Credo di essere stato effettivamente ambiguo, giuro che sarò più chiaro. Sto imparando python dopo anni di php e (mesi di) ruby perchè vedo python + maturo di ruby L'unica cosa che mi lascia perplesso è la troppa scelta di framework per applicazioni web (non so cosa scegliere, forse django) e il fatto che siccome ruby e php vanno di moda c'è un sacco di manualistica (cartacea) in italiano. Vedremo... Per adesso sto leggendo un pò di manuali online e faccio domande in mailing list per vedere se il linguaggio fa al caso mio. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 8/24/07, Simone <[EMAIL PROTECTED]> wrote: > Il giorno 24/ago/07, alle ore 20:13, [EMAIL PROTECTED] > ha scritto: > > Ciao, > > non capisco bene la tua domanda, cosa intendi per compilare uno > > script sotto > > linux? Sei un neofita di python o di linux? :-) > Di python > Intendo compilare come avviene con il C, ma va benissimo il discorso > del modulo in bytecode. ok allora scusa per aver malinterpretato! :-) > Se invece ho capito male la tua domanda, prova a rifarla magari > > indicando > > cosa hai già provato a fare e cosa non ha funzionato come ti > > aspettavi... > Credo di essere stato effettivamente ambiguo, giuro che sarò più chiaro. > Sto imparando python dopo anni di php e (mesi di) ruby perchè vedo > python + maturo di ruby > Mi permetto di darti un consiglio: non pensare tanto alla compilazione in C. In realtà, dovresti cercare di essere il piu' possibile "pythonico"(e non di tradurre il tuo modo di scrivere e di pensare in C in un nuovo linguaggio) ... C'è proprio un piacere nel trovare un modo "bello" di fare le cose in python e poi pensare a quanto sarebbe stato faticoso farlo in C o C++ ciao, francesco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On 24/ago/07, at 20:15, Francesco Guerrieri wrote: E ti sembra poco prendere confidenza con il terminale? :-) e anche abituarsi a leggere i readme, a controllare il make.sys, a sistemare qualche dipendenza... Penso che quando uno ha bisogno di fare le cose impara a farlo. Ma di per se scrivere comandi nel terminale è più un mezzo che un obiettivo. :) -enrico ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] compilare python
On Friday 24 August 2007 21:48, Simone wrote: > Intendo compilare come avviene con il C, ma va benissimo il discorso > del modulo in bytecode. E` possibile con pyinstaller (se non ricordo male il nome), che non fa altro che generare un eseguibile nativo per la piattaforma che ti interessa (supporta anche Windows). Comunque, l'unico vantaggio che avresti rispetto al bytecode (o al sorgente diretto) e` dato dal fatto che la distribuzione dell'applicativo risulta semplificata (ovvero, pyinstaller include anche tutti i moduli necessari al funzionamento dell'applicativo) Enrico P.S. per Windows esiste anche py2exe ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python