[Python] Domande sulla xmlrpclib.ServerProxy e sugli unittest

2007-08-24 Per discussione Roberto Bettazzoni

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

2007-08-24 Per discussione Simone

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

2007-08-24 Per discussione Francesco Guerrieri
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

2007-08-24 Per discussione Massimiliano Giovine
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

2007-08-24 Per discussione Enrico Franchi


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

2007-08-24 Per discussione Francesco Guerrieri
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

2007-08-24 Per discussione Francesco Guerrieri
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

2007-08-24 Per discussione Simone


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

2007-08-24 Per discussione Francesco Guerrieri
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

2007-08-24 Per discussione Enrico Franchi


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

2007-08-24 Per discussione Enrico 'Henryx' Bianchi
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