Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

2022/02/14

Python instalar paquetes propios en local

Si empiezas a estructurar el código de un proyecto en "packages" que pueden ser compartidos entre varios proyectos, pero todavía están en un estado de desarrollo que hace que haya cambios constantes en todos, ¿cómo puedo hacer para tener todo actualizado?

Mejor que estar copiando código o ficheros todo entre proyectos, o haciendo enlaces a directorios, puedes plantear el instalar en local (para ese entorno) los paquetes.

Convertir código en un package

Para hacer un package importable habría que:
  1. Tener todo el código con funcionalidad a importar dentro de una carpeta. P.e. "myproject"
  2. En el directorio padre de crear un fichero "setup.py"
  3. El fichero "setup.py" deberá tener la información necesaria para poder llevar a cabo la importación. P.e:
    from setuptools import setup
    
    setup(name='myproject',
          version='0.1',
          description='myproject does amazing things!',
          url='https://myuser@github.com/myuser/myproject.git',
          author='My Name',
          author_email='myuser@gmail.com',
          license='MIT',
          packages=['myproject'], ##
          zip_safe=False)
    
  4. Ejecutar `python -m pip install -e path_a_myproject` lo que creará un symlink que hará que lso cambios que se ejecuten el local estarán disponibles para todos los proyectos.
Además estos paquetes locales pueden ser incluidos de ese modo en el fichero "requeriments.txt". Para esto hay que tener en cuenta que la ruta es relativa al directorio desde donde se ejecuta "pip install -r" (no la ruta del fichero .txt). 

Más info: 
       
   

2015/01/26

No cerrar consola de windows al ejecutar un script

Si tienes un script, por ejemplo de python, que quieres ejecutar en Windows con un acceso directo (asociando la ejecución con "pythonw.exe" para que se lance la consola) vemos que al hacer click sobre él se ejecuta, pero no podemos ver el resultado ya que se cierra rápidamente la terminal de línea de comandos.

Un truco sencillo es usar el comando "pause" como última línea del script.
Veamos un ejemplo:

C:\Python\pythonw.exe myscript.py
pause
Con eso antes, tras finalizar el script de python se detiene la ejecución hasta que el usuario pulse una tecla y se puede ver la salida del programa en la consola. Esto también funciona scripts en otros lenguajes MSDOS, los .cmd".
       
   

2011/06/23

Indentar todo una sección de código python con emacs

Cuando has programado un trozo de código en python y luego es necesario meterlo en un bucle... Arrrgggg... ¿a indentar línea por línea?

Emacs tiene la solución. Marca la sección que quieres desplazar y teclea:

C-c >

Otros comandos (extraídos de python.about.com):

* C-j: Insert a new line with the same indentation level as the current line
* RET: Insert a new line with the same indentation level as the current line
* C-M-a: Go to the beginning of the current function or class
* C-M-e: Go to the end of the current function or class
* C-M-h: Mark the current function or class for copying, etc.
* C-M-x: Execute the current function or class
* C-c C-b: Submit a bug report
* C-c C-c: Execute the buffer (i.e., the file being displayed)
* C-c C-d: Trace the stack of the process being executed
* C-c C-h: Get context-based help
* C-c TAB: Indent a highlighted (or marked) region
* C-c C-k: Mark a block of text. Using this at the head of a class or function definition will mark the entire block.
* C-c C-l: Shift the region to the left. If the cursor is in the middle of a region, the lower half of the region will shift.
* C-c RET: Execute the current file, opening a new window to show the output.
* C-c C-n: Jump to the next statement.
* C-c C-p: Jump to the previous statement.
* C-c C-r: Shift the region to the right. If the cursor is in the middle of a region, the lower half of the region will shift.
* C-c C-s: Execute a Python command.
* C-c C-t: Toggle shells
* C-c C-u: Go up one block
* C-c C-v: List the version of the Python mode
* C-c C-w: Run PyChecker
* C-c !: Open the Python interactive shell
* C-c #: Comment the highlighted (marked) region
* C-c :: Check the indentation off-set
* C-c <: Shift the region to the left
* C-c >: Shift the region to the right
* C-c ?: Show Python mode documentation
* C-c |: Execute the highlighted (marked) part of the current program.

Note that Python mode for Emacs offers more functionality than this, but these are the basics. If you know Emacs from editing other languages, learning your way around the Python mode is a snap.
       
   

2008/06/10

Ejecutar programas externos desde python

ACTUALIZACIÓN: Si estás ejecutando muchas acciones interaccionando con otros programas en python puede ser interesante Fabric. Super recomendado!!!!


Existen muchas alternativas para ejecutar programas desde python.
Aquí dejo unos ejemplos:

import os
os.system('ls /home/')

Existen multiples variantes del comando os.exec(). Por ejemplo, ejecutar el programa indicado reemplazando el proceso actual:
os.execl('/bin/ls')

Lo mismo que antes, pero con un listado de parámetros (atención: recordad que la lista de argumentos empieza en 0, no en 1):
os.execl('/bin/ls', '/bin/ls', '-l', '-i')

Ejecuta el comando buscando en $PATH y reemplazando el proceso actual:
os.execlp('ls', 'ls', '-lisa')

Si lo que necesitas es crear un nuevo proceso primero:
if os.fork()==0:
    os.execlp('ls')
else:
    print 'Fork has failed!'

Y si queremos ver la salida del programa ejecutado:
import commands

a = commands.getstatusoutput('ls')

aList = a.split('\n')

En lugar de usar la opción de hacer un fork() y obtener un nuevo proceso que controlaremos con su PID, es recomendable usar el módulo subprocess y su clase Popen. Más sobre esto y otros temas relacionados en el aquí.
       
   

2008/05/26

Ejecutar un script externo en consola de Python, IDLE, Jython y BeanShell

Jython y BeanShell son muy útiles para ejecturar comandos de forma interactiva. Sin embargo, cuando se quieren ejecutar directamente scripts escritos la opción de cortar y pegar no es muy cómoda. Por eso en ocasiones, puede ser útil usar lo siguiente:
En BeanShell:
filepath = "/usr/local/scripts/bsh/myscript.bsh";
source(filepath);
En Jython:
filepath = '/usr/local/scripts/py/myscript.py'
execfile(filepath)
Este modo de lanzar scripts tiene también la ventaja de que, en caso de fallos en el script, los mensajes de error dan una información más completa aportando por ejemplo la línea donde se ha producido el error.

UPDATE: Ejecutar un script externo en IDLE o en la consola interactiva de python

En la consola de IDLE se podría ejecutar un script externo con:
filepath = '/usr/local/scripts/py/myscript.py'
execfile(filepath)

En python3 sería:

exec(open("/usr/local/scripts/py/myscript.py").read())

UPDATE2: Ejecutar un script externo en ipython 

En ipython existe la posibilidad de usar el comando "run" directamente (sin comillas en el path) para ejecutar un script externo, es decir:
run /usr/local/scripts/py/myscript.py


       
   

2008/05/23

Bajar automáticamente archivos de un FTP con python

A menudo hay que acceder a un ftp y bajarse gran número de ficheros con un determinado nombre de diferentes directorios. Automatizar este proceso puede ser bastante útil en muchos casos. Usar un cliente FTP gráfico no suele ser de ayuda en estos casos. Los clientes FTP en línea de comandos son interactivos por lo que no se pueden realizar scripts con ellos, más allá de ejecutar una lista de comandos predefinida.

Este simple script se conecta a un servidor, se posiciona en la carpeta 'CATASTRO', y se accede a todos los directorios con profundidad '1' guardando los ficheros que interesan, en este caso shapefiles llamados MASA, en una carpeta local.

#!/usr/bin/python
# DESCRIPTION: Python script that connects to a FTP server and 
#              gets some Shapefiles from 'CATASTRO' folder and subfolders
# AUTHOR: Nacho Uve
# DATE  : May 2008
# LICENSE: GPL2 or greater
from ftplib import FTP

ftp = FTP('server.com');
ftp.login(user='myuser', passwd='mypassword')
ftp.cwd("CATASTRO");

# OPTION: To get a 'ls -l' list                                                                                                                                                                 
# dirs = []                                                                                                                                                                                     
# # Used a callback to 'dirs'                                                                                                                                                                   
# ftp.dir(dirs.append)                                                                                                                                                                          

dirs = ftp.nlst()
for row in dirs:
    print row
    ftp.cwd(row)
    # Save shapefiles in the local machine with the first word of the folder as filename
    ftp.retrbinary('RETR MASA.SHP', open(row.split()[0]+'.shp','wb').write)
    ftp.retrbinary('RETR MASA.SHX', open(row.split()[0]+'.shx','wb').write)
    ftp.retrbinary('RETR MASA.DBF', open(row.split()[0]+'.dbf','wb').write)
    ftp.cwd('..')
ftp.quit()