<jupyter_start><jupyter_text>Módulos del sistema En estos apuntes se mostrarán usos básicos de los módulos que permiten interactuar con el sistema operativo.  Módulo `os`<jupyter_code>import os<jupyter_output><empty_output><jupyter_text>Sistema operativo<jupyter_code>os.name<jupyter_output><empty_output><jupyter_text>Para datos más específicos como nombre del sistema operativo o del ordenador<jupyter_code>os.uname()<jupyter_output><empty_output><jupyter_text>Cantidad de cpus disponibles<jupyter_code>os.cpu_count()<jupyter_output><empty_output><jupyter_text>Para mostrar el directorio de trabajo<jupyter_code>os.getcwd()<jupyter_output><empty_output><jupyter_text>Este valor se puede asignar a una variable para un uso posterior<jupyter_code>curdir = os.getcwd()<jupyter_output><empty_output><jupyter_text>Para moverse del directorio actual a un nivel anterior<jupyter_code>os.chdir('..')<jupyter_output><empty_output><jupyter_text>Para ver la nueva ubicación<jupyter_code>os.getcwd()<jupyter_output><empty_output><jupyter_text>Con la variable salvada se puede volver al directorio original<jupyter_code>os.chdir(curdir)
os.getcwd()<jupyter_output><empty_output><jupyter_text>Para crear un directorio<jupyter_code>os.mkdir('DirectorioCreado')<jupyter_output><empty_output><jupyter_text>También se pueden indicar los permisos que se quieren dar al directorio<jupyter_code>os.mkdir('DirectorioCreadoConPermisos',0o770)<jupyter_output><empty_output><jupyter_text>Para ver los permisos<jupyter_code>status = os.stat('DirectorioCreadoConPermisos')
oct(status.st_mode & 0o777)<jupyter_output><empty_output><jupyter_text>Para saber si un directorio existe<jupyter_code>os.path.exists('DirectorioCreado')
os.path.exists('DirectorioCreadoConPermisos')<jupyter_output><empty_output><jupyter_text>Para eliminar un directorio sin archivos en su interior<jupyter_code>os.rmdir('DirectorioCreado')
os.rmdir('DirectorioCreadoConPermisos')<jupyter_output><empty_output><jupyter_text>Para concatenar elementos y formar una ruta<jupyter_code>os.path.join(os.getcwd(),'Plop')<jupyter_output><empty_output><jupyter_text>Para separar el nombre del directorio de trabajo del resto de la ruta<jupyter_code>os.path.split(os.getcwd())<jupyter_output><empty_output><jupyter_text>Para crear directorios anidados<jupyter_code>os.makedirs('DirectorioCreado/DirectorioAnidadoL1/DirectorioAnidadoL2')<jupyter_output><empty_output><jupyter_text>Para ver la estructura de arbol de un directorio<jupyter_code>for root, dirs, files in os.walk(os.path.join(curdir,'DirectorioCreado'), topdown=False):
    print(root, dirs, files)<jupyter_output>/home/stefanos/Documents/sobre-python/DirectorioCreado/DirectorioAnidadoL1/DirectorioAnidadoL2 [] []
/home/stefanos/Documents/sobre-python/DirectorioCreado/DirectorioAnidadoL1 ['DirectorioAnidadoL2'] []
/home/stefanos/Documents/sobre-python/DirectorioCreado ['DirectorioAnidadoL1'] []<jupyter_text>Para mostrar los archivos del directorio actual<jupyter_code>os.listdir()<jupyter_output><empty_output><jupyter_text>Para mostrar los archivos del directorio `home`<jupyter_code>os.listdir('/home')<jupyter_output><empty_output><jupyter_text>Para mostrar los archivos del directorio `DirectorioCreado`<jupyter_code>os.listdir('./DirectorioCreado')<jupyter_output><empty_output><jupyter_text>Para mostrar los archivos del directorio `DirectorioAnidadoL1`<jupyter_code>os.listdir('./DirectorioCreado/DirectorioAnidadoL1')<jupyter_output><empty_output><jupyter_text>Para eliminar un directorio con archivos en su interior, primero eliminas los archivos en el interior<jupyter_code>for root, dirs, files in os.walk(os.path.join(curdir,'DirectorioCreado'), topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))<jupyter_output><empty_output><jupyter_text>Luego eliminas el directorio<jupyter_code>os.rmdir('DirectorioCreado')<jupyter_output><empty_output><jupyter_text>Validar que ya no existe<jupyter_code>os.path.exists('DirectorioCreado')<jupyter_output><empty_output><jupyter_text>Crear un archivo de prueba para mostrar como cambiar permisos<jupyter_code>! touch archivo-prueba.txt<jupyter_output><empty_output><jupyter_text>Cambiar permisos del archivo<jupyter_code>os.chmod('archivo-prueba.txt', 0o777)<jupyter_output><empty_output><jupyter_text>Ver los nuevos permisos<jupyter_code>status = os.stat('archivo-prueba.txt')
oct(status.st_mode & 0o777)<jupyter_output><empty_output><jupyter_text>Borrar el archivo de prueba<jupyter_code>os.remove('archivo-prueba.txt')
os.path.exists('archivo-prueba.txt')<jupyter_output><empty_output><jupyter_text>Crear un archivo de prueba<jupyter_code>! touch prueba.txt<jupyter_output><empty_output><jupyter_text>Ver la lista de archivos<jupyter_code>os.path.exists('prueba.txt')
os.rename('prueba.txt', 'meh.txt')<jupyter_output><empty_output><jupyter_text>Validar que el archivo con nombre cambiado existe<jupyter_code>os.path.exists('meh.txt')<jupyter_output><empty_output><jupyter_text>Eliminar un archivo y volver a ver los archivos del directorio<jupyter_code>os.remove('meh.txt')<jupyter_output><empty_output><jupyter_text>Variables de entorno<jupyter_code>for envar in os.environ:
    print(envar)<jupyter_output>SHELL
COLORTERM
PYTHONUNBUFFERED
TERM_PROGRAM_VERSION
PIPENV_ACTIVE
LC_ADDRESS
LC_NAME
LC_MONETARY
PWD
LOGNAME
XDG_SESSION_TYPE
VSCODE_GIT_ASKPASS_NODE
MOTD_SHOWN
PIP_PYTHON_PATH
HOME
LANG
LC_PAPER
LS_COLORS
VIRTUAL_ENV
GIT_ASKPASS
SSH_CONNECTION
VSCODE_GIT_ASKPASS_EXTRA_ARGS
LESSCLOSE
XDG_SESSION_CLASS
LC_IDENTIFICATION
TERM
LESSOPEN
USER
VSCODE_GIT_IPC_HANDLE
SHLVL
LC_TELEPHONE
LC_MEASUREMENT
XDG_SESSION_ID
PYTHONDONTWRITEBYTECODE
XDG_RUNTIME_DIR
PS1
SSH_CLIENT
LC_TIME
VSCODE_GIT_ASKPASS_MAIN
XDG_DATA_DIRS
BROWSER
PATH
DBUS_SESSION_BUS_ADDRESS
LC_NUMERIC
TERM_PROGRAM
VSCODE_IPC_HOOK_CLI
_
JPY_PARENT_PID
CLICOLOR
PAGER
GIT_PAGER
MPLBACKEND<jupyter_text>El `shell` que se usa<jupyter_code>os.environ['SHELL']<jupyter_output><empty_output><jupyter_text>La ruta `home`<jupyter_code>os.environ['HOME']<jupyter_output><empty_output><jupyter_text>Ruta absoluta del directorio actual<jupyter_code>os.path.abspath('.')<jupyter_output><empty_output><jupyter_text>Ruta absoluta del directorio `Music`<jupyter_code>os.path.abspath('../../Music')<jupyter_output><empty_output><jupyter_text>Para saber si una ruta es un archivo<jupyter_code>os.path.isfile('../../Music')<jupyter_output><empty_output><jupyter_text>Para saber si una ruta es un directorio<jupyter_code>os.path.isdir('../../Music')<jupyter_output><empty_output><jupyter_text>Para ejecutar comandos del sistema operativo, en este ejemplo, se crea un archivo de texto de nombre **cheere** redireccionando la salida del comando `echo`<jupyter_code>os.system('echo "Python es cheere" > cheere.txt')<jupyter_output><empty_output><jupyter_text>Validar que el archivo existe<jupyter_code>os.path.exists('cheere.txt')<jupyter_output><empty_output><jupyter_text>Ver el contenido del archivo con el comando `cat`<jupyter_code>os.system('cat cheere.txt')<jupyter_output>Python es cheere<jupyter_text>Eliminar el archivo porque no interesa<jupyter_code>os.remove('cheere.txt')<jupyter_output><empty_output><jupyter_text>Módulo `sys`<jupyter_code>import sys<jupyter_output><empty_output><jupyter_text>Plataforma en uso<jupyter_code>sys.platform<jupyter_output><empty_output><jupyter_text>Versión de Python en uso<jupyter_code>sys.version<jupyter_output><empty_output><jupyter_text>Ubicación de las dependencias de Python<jupyter_code>sys.path<jupyter_output><empty_output><jupyter_text>Ruta absoluta del ejecutable que hace de intérprete de Python en uso<jupyter_code>sys.executable<jupyter_output><empty_output><jupyter_text>Pasar argumentos por línea de comandos a un _script_ de Python<jupyter_code>%%file cmdargs.py

# script para imprimir los argumentos pasados por linea de comandos
import sys

# forma 0
print('argumento 0 = ', sys.argv[0])
print('argumento 1 = ', sys.argv[1])
print('argumento 2 = ', sys.argv[2])
print('argumento 3 = ', sys.argv[3])

# forma 1
for index, arg in enumerate(sys.argv):
    print('argumento', index, '=', arg)

# forma 2    
for i in range(len(sys.argv)):
    print('argumento', i, '=', sys.argv[i])
! python3 cmdargs.py 1 2 3 4
! rm cmdargs.py<jupyter_output><empty_output><jupyter_text>Escapar de la ejecución del _script_ en caso no se cumpla alguna condición<jupyter_code>%%file escapar.py

# script que imprime los argumentos de la linea de comandos solo cuando son mas de uno
import sys

if len(sys.argv) == 1:
    print('Mal uso')
    print('Ejemplo de uso: python3 %s 1 2 3' % (sys.argv[0]))
    sys.exit(1)
    
for i in range(1,len(sys.argv)):
    print(sys.argv[i])  

! python3 escapar.py
! python3 escapar.py 1 2 3
! rm escapar.py<jupyter_output><empty_output><jupyter_text>Módulo `shutil`<jupyter_code>import shutil<jupyter_output><empty_output><jupyter_text>Copiar un archivo<jupyter_code>shutil.copyfile('archivo.txt', 'archivo.txt.copy')
! ls -l<jupyter_output>total 2740
-rw-rw-r-- 1 stefanos stefanos 109847 Ipam  8 11:55 algoritmos-por-bloques.ipynb
-rw-rw-r-- 1 stefanos stefanos     17 Pet  15 12:50 archivo.txt
-rw-rw-r-- 1 stefanos stefanos     17 Pet  16 19:34 archivo.txt.copy
-rw-rw-r-- 1 stefanos stefanos  71544 Ipam 21 09:52 ctypes-structure.ipynb
-rw-rw-r-- 1 stefanos stefanos  47670 Ipam  5 20:46 efectos-localidad.ipynb
-rw-rw-r-- 1 stefanos stefanos 135089 Ipam 19 10:29 efectos-localidad-matriz-matriz.ipynb
-rw-rw-r-- 1 stefanos stefanos 499451 Yag  20 19:38 euler-nbprob.ipynb
-rw-rw-r-- 1 stefanos stefanos 141710 Ipam 12 07:19 factorial.ipynb
-rw-rw-r-- 1 stefanos stefanos  76163 Ipam  1 10:54 gcc-optis.ipynb
-rw-rw-r-- 1 stefanos stefanos   1064 Dait  1 18:10 LICENSE
-rw-rw-r-- 1 stefanos stefanos 151437 Yag  30 09:16 matplotlib-general.ipynb
-rw-rw-r-- 1 stefanos stefanos  64651 Yag  20 19:38 numpy-general.ipynb
-rw-rw-r-- 1 stefanos stefanos 141279 Yag  20 19:38 pandas-general.ipynb
-rw-rw-r-- 1 stefanos stefanos [...]<jupyter_text>Copiar un directorio con todo su contenido<jupyter_code>os.makedirs('DirectorioCreado/DirectorioInterno1/DirectorioInterno2')
shutil.copytree('DirectorioCreado', 'DirectorioCreadoCopia')<jupyter_output><empty_output><jupyter_text>Eliminar un directorio con elementos internos es más sencillo con `shutil` que con `os`<jupyter_code>shutil.rmtree('DirectorioCreado')
shutil.rmtree('DirectorioCreadoCopia')<jupyter_output><empty_output><jupyter_text>Ubicación de archivos<jupyter_code>shutil.which('python3')
shutil.which('ls')
shutil.which('sudo')<jupyter_output><empty_output><jupyter_text>Espacio usado en un directorio<jupyter_code>total_b, used_b, free_b = shutil.disk_usage('.')

gb = 10 ** 9

print('Total: {:6.2f} GB'.format(total_b / gb))
print('Used : {:6.2f} GB'.format(used_b / gb))
print('Free : {:6.2f} GB'.format(free_b / gb))<jupyter_output>Total: 104.62 GB
Used :  17.48 GB
Free :  81.78 GB
{'fraction_non_alphanumeric': 0.11078637318476574, 'fraction_numerical': 0.021554479861174536, 'mean_word_length': 8.186241610738255, 'pattern_counts': {'":': 0, '<': 224, '<?xml version=': 0, '>': 225, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '57', 'dir': 'jupyter-structured-clean-dedup', 'id': '449032', 'license': 'MIT', 'n_tokens_mistral': 4559, 'n_tokens_neox': 4374, 'n_words': 739, 'path': 'python-os-sys.ipynb', 'repo_name': 'stefano-andre/sobre-python', 'size': '10949'}