Tengo una relación de amor y odio con Bash. Paso mucho tiempo en la terminal y bash es mi "lenguaje de programación" predeterminado. A veces le digo a la gente que find, grep y xargs ejecutan su infraestructura, y se ríen y ríen hasta que se dan cuenta de que hablo en serio.
Adquirir algo de Python es una elección perfecta para los administradores de sistemas. También es genial para cualquiera que tenga que lidiar con cualquier cosa en una terminal pero no quiera usar bash, o tenga necesidades que sean demasiado complejas para bash. Una vez que una tarea va más allá
find $(pwd) -name "*.txt" | xargs -I {} echo "do stuff with {}"
¡Es hora de lanzar Python!
Hay muchos beneficios al usar Python como su lenguaje de línea de comandos.
- Python tiene muchas bibliotecas agradables para ayudar con casi cualquier cosa. Eso incluye lidiar con las operaciones del sistema, leer archivos, enumerar directorios, escribir bucles, verificar códigos de salida, etc.
- Autocompletar con IDE. Seriamente. ¿Quién quiere tener que memorizar algo?
- Conjunto de pruebas robusto si eso es lo tuyo (y si no lo es, deberías considerar hacerlo lo tuyo).
- La consola iPython. Es maravilloso. Es asombroso. ME ENCANTA.
- Python está disponible en la mayoría de los sistemas, y si no lo está, puede obtenerlo con Miniconda.
- Comprobación de errores robusta con bloques try and catch.
- Si trabaja en diferentes sistemas operativos, puede usar bibliotecas de Python que se encargarán de todo eso bajo el capó.
- Incluso si no tiene capacidad de programación, Python es un lenguaje fácil de usar.
Empecemos
Para comenzar, primero necesitará tener instalado Python o instalarlo con Miniconda.
Compruebe si tiene iPython instalado
which python which ipython
Si ambos tienen éxito, ¡estás en el negocio! Si tiene Python, pero no iPython, tendrá que instalarlo. Puede instalarlo como un paquete de sistema, pero realmente recomiendo que lo instale con Miniconda.
Instalar Miniconda
Coge el instalador para tu sistema operativo aquí. Sugiero obtener la instalación de Python3.
Entonces es solo una instalación simple.
bash Miniconda3-latest-Linux-x86_64.sh
Siga las instrucciones y tendrá Miniconda3 instalado. Una vez que lo tenga instalado, querrá ejecutar una actualización, porque esto es tecnología y, por supuesto, desea ejecutar una actualización. ;-)
conda update conda conda config --add channels conda-forge conda update -y --all conda install -y ipython
Solución de problemas
Si tiene problemas para instalar algún paquete, aquí tiene algunos consejos.
- Ejecuta
conda clean --all
y vuelve a intentarlo. - Asegúrate de estar usando el canal correcto.
- correr
conda update -y --all
- Intente instalar lo menos posible en su espacio de conda global. En su lugar, cree entornos para diferentes tareas y proyectos, que veremos a continuación.
Crea entornos con Conda
Si alguna vez ha usado virtualenv, pipenv (¿es eso una cosa?), Rbenv, plenv, anyenv o cualquiera de los otros envs que han aparecido a lo largo de los años, esto le resultará muy familiar. La idea es que los diferentes proyectos tengan sus propios entornos de software aislados.
conda create -n my-project ipython package1 package2 package2
Si eres como yo y te gusta tener iPython disponible, ¡asegúrate de instalarlo en cualquier entorno nuevo!
Bibliotecas Python para la administración del sistema
Antes de entrar en los ejemplos, enumeremos algunos paquetes útiles junto con sus documentos.
Mi paquete ir a es el paquete del sistema operativo. Puede usarlo para enumerar directorios, verificar si existen archivos, verificar si existen enlaces simbólicos, crear directorios, ejecutar comandos del sistema, obtener y establecer variables ambientales, y más. ¡Es genial!
Mi segundo paquete para ejecutar comandos del sistema que no existen como bibliotecas prácticas de Python es el módulo de subproceso.
El shutil tiene operaciones de archivo que no están en la biblioteca del sistema operativo.
La biblioteca pprint imprime estructuras de datos complejas con una buena sangría.
La biblioteca pytest te permite probar tu código Python, porque seamos sinceros, nada funciona correctamente la primera (pocas) veces.
¿Cómo ejecuto mi código?
¡Finalmente! ¡Código!
Cuando usa Python para la administración del sistema, puede sumergirse directamente en la consola de iPython o escribir scripts y luego ejecutarlos con python name-of-script.py
.
Si prefiere escribir sus guiones, tiene muchas opciones y es realmente una cuestión de preferencia personal. Yo uso PyCharm, que es de pago, pero Visual Studio Code y Atom son opciones gratuitas igualmente excelentes.
Encuentro que depende de en lo que esté trabajando. A veces simplemente abro la consola iPython y empiezo a escribir, y otras veces necesito algo más sólido con pruebas y todo eso.
Si está utilizando la consola iPython o cualquiera de los editores que enumeré anteriormente, habrá autocompletado. ¡Autocompletar es increíble! Con iPython, simplemente comience a escribir su función y presione el tabulador para obtener una lista de las funciones potenciales que puede desear.
No puedo expresar cuánto amo la función de autocompletar. ;-)
Consigue ayuda
Puede ir a cualquiera de las páginas de documentos de cualquier biblioteca, pero si conoce el nombre de la biblioteca o de la función, puede abrirla en iPython.
You can bring up the help menu in most IDEs and text editors too, but that will be specific to your editor.
Examples
First you will need to import your packages
import os import subprocess import shutil from pprint import pprint
Here are some examples of common file and directory operations.
# Get your current working directly # This returns a string my_cwd = os.getcwd() print(my_cwd)
# List the contents of a directory # This returns a list dir_list = os.listdir() for item in dir_list: print(item)
# Get the Absolute Path name of a file (file + current working dir) os.path.abspath('some-file')
#Get the basename - returns file os.path.basename('/path/to/file')
# Split a directory path - platform independent os.path.split(os.getcwd()) # Out[17]: ('/Users', 'jillian')
# Check if a path exists os.path.exists('/path/on/filesystem')
# Check if a path is a symlink os.path.islink()
Move files and directories around
# Copy a directory # cp -rf shutil.copytree('src', 'dest')
# Copy a file # cp -rf shutil.copyfile('file1', 'file2')
# Move a directory # mv shutil.move('src', 'dest')
Not everything is going to be available through python libraries, such as installing system libraries, so run a few system commands!
# Run an arbitrary system command command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE) #Print the stdout and stderr print(result.stdout) print(result.stderr)
Write to files!
# Write to a file (and create it if it doesn't exist) # echo "hello" > hello.txt f= open("hello.txt","w+") f.write("hello!") f.close()
# Append to a file # echo "hello" >> hello.txt f = open("hello.txt", "a+") f.write("hello again!") f.close()
Write some tests!
Tests mostly work by using a function called assert, which is essentially saying make sure this is true and if not die loudly.
def test_system_command(): """Test the exit code of a system command""" command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE) assert result.returncode == 0
Put this function in a file called test_my_code.py
and run as pytest test_my_code.py
.
Wrap Up
That's it for my main tips and tricks for using Python as your go-to bash replacement. The next time you need to write a loop in bash, consider breaking out the iPython console and seeing what you can come up with instead!