[pyar] [ modulos y paquetes... no los entiendo]

goosfancito goosfancito en gmail.com
Lun Feb 6 19:05:21 ART 2012


El 06/02/12 10:10, Emiliano Dalla Verde Marcozzi escribió:
>
>     2012/2/5 goosfancito <goosfancito en gmail.com
>     <mailto:goosfancito en gmail.com>>:
>
>
>     > test
>     > ------ modulo1
>     > ---------programa1.py
>     >               def actividad
>     > ------ modulo2
>     > ----------programa2.py
>     >               def correr
>     >               def caminar
>     > -------programa3.py
>     >             def persona
>     >
>     >
>     > si estoy ejecutando programa1.py y necesito a programa2.py como
>     utilizo
>     > el import?
>     >
>
>
> A ver si por ahi esto te ayuda un poquito ... lo primero que hay que 
> saber y te
> lo explica bien el link del tutorial que te paso Diego, es el tema de 
> como python
> busca y encuentra desde donde ejecutar codigo, por aca una 'sesion' de 
> bash y
> lo que comienza con '#' son mis comentarios:
>
> yuno en Asuka:~/asd$ python  # arranco python
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>
> >>> from foo import bar  # trato de importar bar desde foo
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ImportError: No module named foo  # me dice que no existe el modulo 
> foo, bueno, lo creo
> >>>
>
> yuno en Asuka:~/asd$ touch foo.py  # aca creo el modulo foo, touch crea 
> el nuevo archivo
> yuno en Asuka:~/asd$ echo '  # uso echo desde bash para escribir un 
> metodo en el archivo
> > def bar():\
> >     print 1 + 1' > foo.py
>
> yuno en Asuka:~/asd$ cat foo.py  # asi me quedo foo.py, con el metodo bar 
> escrito
>
> def bar():\
>     print 1 + 1
>
>
> yuno en Asuka:~/asd$ python  # ahora arranco de nuevo el interprete de 
> python y trato de importar bar desde foo
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar  # esta vez funciona, y es mas, puedo ejecutar 
> la funcion bar
> >>> bar()
> 2
> >>>
>
> Bueno, resumiendo un poco lo de los comentarios ... primero quisimos 
> importar un metodo bar desde un modulo
> foo y ese modulo foo no existia. Entonces, creamos foo.py y el metodo 
> bar dentro y todo de maravillas. Ahora,
> vamos un paso mas adelante y supongamos que queremos usar este metodo 
> 'bar' que se encuentra definido en
> el modulo foo pero, ... desde un nuevo modulo ... llamese 'teta':
>
> yuno en Asuka:~/asd$ touch teta.py
> yuno en Asuka:~/asd$ cat teta.py
> from foo import bar
> bar()
> yuno en Asuka:~/asd$ python teta.py
> 2
> yuno en Asuka:~/asd$ ls
> foo.py teta.py
> yuno en Asuka:~/asd$
>
> Bueno, al ejecutar python teta.py, la primer linea dice 'from foo 
> import bar', entonces el interprete BUSCA
> ese modulo foo ... y como lo busca ? bueno, el primer lugar donde 
> busca es en el directorio actual donde
> vos ejecutaste el comando 'python teta.py' y como en ese directorio 
> tambien esta foo.py, entonces lo
> encuentra (fijate que por eso te copie y pegue la salida del 'ls'). En 
> caso que no encontrara a foo.py en el
> directorio donde vos ejecutaste el comando 'python ... ' va a ir a 
> buscar a lugares que estan definidos en
> sys.path ... y como sabes cuales son esos lugares? pues desde el 
> interprete:
>
> yuno en Asuka:~/asd$ python
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import sys
> >>> sys.path
> ['', 
> '/usr/local/lib/python2.7/dist-packages/virtualenvwrapper-2.10-py2.7.egg', 
> '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', 
> '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', 
> '/usr/lib/python2.7/lib-dynload', 
> '/usr/local/lib/python2.7/dist-packages', 
> '/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info', 
> '/usr/lib/python2.7/dist-packages', 
> '/usr/lib/python2.7/dist-packages/PIL', 
> '/usr/lib/python2.7/dist-packages/gst-0.10', 
> '/usr/lib/python2.7/dist-packages/gtk-2.0', 
> '/usr/lib/pymodules/python2.7', 
> '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', 
> '/usr/lib/python2.7/dist-packages/ubuntuone-client', 
> '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', 
> '/usr/lib/python2.7/dist-packages/ubuntuone-couch', 
> '/usr/lib/python2.7/dist-packages/ubuntuone-installer', 
> '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', 
> '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
>
> Ves todos esos paths, elementos de esa lista sys.path ? bueno, python 
> va a andar buscando a foo.py por todos esos
> lugares en caso de que no lo encontrara en el directorio donde vos 
> ejecutaste el comando python. Mira, rompamos el
> ejemplo que puse antes, osea lo que voy a hacer es mover el modulo foo 
> a otro directorio y veamos que pasa:
>
> yuno en Asuka:~/asd$ ls -las
> total 20
> 4 drwxrwxr-x  2 yuno yuno 4096 2012-02-06 09:45 .
> 4 drwxr-xr-x 62 yuno yuno 4096 2012-02-06 09:35 ..
> 4 -rw-rw-r--  1 yuno yuno   29 2012-02-06 09:38 foo.py
> 4 -rw-rw-r--  1 yuno yuno   26 2012-02-06 09:47 teta.py
>
> yuno en Asuka:~/asd$ python
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar
> >>> bar()
> 2
> >>> # aca salgo del interprete con ctrl + d
>
> yuno en Asuka:~/asd$ mv foo.py otracosa.py  # renombro el archivo foo a 
> otracosa.py
> yuno en Asuka:~/asd$ rm foo.pyc  # borro el *.pyc, python a partir de 
> archivos .py crea archivos .pyc que los lee mas rapido
>                                                  # si dejara el 
> foo.pyc , python seguiria encontrando al modulo foo, y no queremos eso ;)
>
> yuno en Asuka:~/asd$ python
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ImportError: No module named foo
>
> >>> from otracosa import bar
> >>> bar()
> 2
>
> Bien, repasando ... renombramos foo.py a otracosa.py y entonces ya no 
> funcionaba mas el import, puesto
> que no se encontraba el modulo foo.py en el directorio donde yo 
> ejecute 'python ...' y porque el modulo foo.py
> tampoco se encuentra en ninguno de los paths definidos / listados en 
> sys.path.
>
> Ahora bien, yo siempre use como módulos archivos .py, pero tambien 
> podes crear directorios e 'importarlos',
> veamos un ejemplo primero con nuestro foo.py pero ahora en forma de 
> 'directorio':
>
> yuno en Asuka:~/asd$ ls -las  # borre todo, osea arrancamos de 0
> total 8
> 4 drwxrwxr-x  2 yuno yuno 4096 2012-02-06 10:00 .
> 4 drwxr-xr-x 62 yuno yuno 4096 2012-02-06 09:35 ..
>
> yuno en Asuka:~/asd$ mkdir foo  # creo el directorio 'foo'
> yuno en Asuka:~/asd$ touch foo/__init__.py  # creo un archivo que SI o SI 
> se tiene que llamar __init__.py
> yuno en Asuka:~/asd$ touch foo/bar.py  # creo un modulo bar.py dentro de foo
> yuno en Asuka:~/asd$ cat ./foo/bar.py  # el contenido de bar.py tiene 
> definido una funcion 'hello'
> def hello():
>     print('hola')
>
> Ahora nos vamos al interprete de python:
>
> yuno en Asuka:~/asd$ python
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar
> >>> bar.hello()
> hola
> >>>
>
> Buenisimo! ejecutamos la funcion hello ! ^^ ... bien, porque es tan 
> importante ese archivo __init__.py ? porque
> le dice a python que ese directorio foo es importante y que lo debe 
> tener en cuenta a la hora de 'buscar modulos',
> fijemosnos que pasa si borramos ese archivito __init__.py:
>
> yuno en Asuka:~/asd$ pwd  # mi directorio actual
> /home/yuno/asd
> yuno en Asuka:~/asd$ ls  # solo tengo el directorio foo
> foo
> yuno en Asuka:~/asd$ rm foo/__init__.py  # borramos el __init__.py
> yuno en Asuka:~/asd$ rm foo/__init__.pyc  # borramos su correspondiente 
> archivo .pyc que crea python
>
> yuno en Asuka:~/asd$ python  # ejecutamos el interprete:
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ImportError: No module named foo
> >>>
>
> Al sacar el __init__.py,  python ya no considera al directorio foo, 
> entonces falla ...
> Otra cosa muy importante es 'desde donde' osea desde que lugar en el 
> path ejecutas tus cosas
> python, miremos un ejemplo ...
>
> yuno en Asuka:~/asd$ pwd  # este es el directorio actual donde 'estoy parado'
> /home/yuno/asd
> yuno en Asuka:~/asd$ touch foo/__init__.py  # creo el archivo que le 
> borre antes a foo
> yuno en Asuka:~/asd$ cd foo/  # me meto dentro del directorio foo
>
> yuno en Asuka:~/asd/foo$ python  # entramos al interprete
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar  # NO NOS FUNCIONA! OHHHHHHH NOOOO !!!!!
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> ImportError: No module named foo
> >>>  # salgo del interprete
>
> yuno en Asuka:~/asd/foo$ pwd  # ok, estamos dentro del directorio foo, si 
> esta bien, nosotros nos metimos aca antes ...
> /home/yuno/asd/foo
> yuno en Asuka:~/asd/foo$ cd ..  # vamos un directorio arriba
> yuno en Asuka:~/asd$ python  # abrimos nuevamente el interprete
> Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
> [GCC 4.6.1] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from foo import bar  # Y AHORA NOS FUNCIONA, YES YES YES!!!
> >>>
>
> En fin, quedo un poco mas claro el tema ? no dudes en leer 
> detenidamente y tranca el tutorial y la sección
> módulos que te paso Diego que ahí esta muy buen explicado,
> Saludos,
>
> -- 
> ???????
> https://bitbucket.org/edvm
>
>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar

Gracias por la explicacion
por primera vez pude hacer andar el import,.

Gustavo
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120206/99f41ed7/attachment.html>


More information about the pyar mailing list