¿Qué es exactamente el directorio de trabajo actual?
Mi libro dice:
Cada programa que se ejecuta en su computadora tiene un directorio de trabajo actual, o cwd. Se supone que cualquier nombre de archivo o ruta que no comience con la carpeta raíz se encuentra en el directorio de trabajo actual.
Como estoy en OSX, mi carpeta raíz es /. Cuando escribo os.getcwd()
en mi shell de Python, aparece /Users/apple/Documents
. ¿Por qué aparece la carpeta Documentos en mi cwd? ¿Dice que Python está usando la carpeta Documentos? ¿ No hay ninguna ruta que dirija a Python que comience con /
(la carpeta raíz)? Además, ¿cada programa tiene un cwd diferente?
Cada proceso tiene un directorio actual. Cuando se inicia un proceso, simplemente hereda el directorio actual de su proceso principal; y no está, por ejemplo, configurado en el directorio que contiene el programa que está ejecutando.
Para una explicación más detallada, sigue leyendo.
Cuando los discos se volvieron lo suficientemente grandes como para no querer que todos los archivos estuvieran en el mismo lugar, los proveedores de sistemas operativos idearon una manera de estructurar los archivos en directorios . Entonces, en lugar de guardar todo en el mismo directorio (o "carpeta", como ahora se les enseña a llamar a los principiantes), puede crear nuevas colecciones y otras colecciones nuevas dentro de ellas (excepto en algunas implementaciones iniciales, los directorios no podían contener otros directorios).
Básicamente, un directorio es simplemente un tipo peculiar de archivo, cuyo contenido es una colección de otros archivos, que también pueden incluir otros directorios.
En un sistema operativo primitivo, ahí terminaba la historia. Si quisieras imprimir un archivo llamado term_paper.txt
que estaba en el directorio spring_semester
que a su vez estaba en el directorio 2021
que estaba en el directorio studies
en el directorio mine
, tendrías que decir
print mine/studies/2021/spring_semester/term_paper.txt
(excepto que el comando era probablemente algo más arcano que print
, y el separador de directorio podría haber sido algo loco como corchetes y dos puntos, o algo así;
lpr [mine:studies:2021:spring_semester]term_paper.txt
pero esto no es importante para esta exposición) y si quisieras copiar el archivo, tendrías que deletrear la enchilada completa dos veces:
copy mine/studies/2021/spring_semester/term_paper.txt mine/studies/2021/spring_semester/term_paper.backup
Luego surgió el concepto de un directorio de trabajo actual. ¿Qué pasaría si pudiera decir "de ahora en adelante, hasta que yo diga lo contrario, todos los archivos de los que hablo estarán en este directorio en particular"? Así cd
nació el comando (excepto en sistemas antiguos como VMS, se llamaba algo más complicado, como SET DEFAULT
).
cd mine/studies/2021/spring_semester
print term_paper.txt
copy term_paper.txt term_paper.backup
Eso es realmente todo lo que hay que hacer. Cuando usted cd
(o, en Python, os.chdir()
), cambia su directorio de trabajo actual. Permanece hasta que cierra la sesión (o sale de este proceso), o hasta que ingresa cd
a un directorio de trabajo diferente, o cambia a un proceso o ventana diferente donde está ejecutando un comando separado que tiene su propio directorio de trabajo actual. Así como puede tener su explorador de archivos (Explorer, Finder, Nautilus o como se llame) abierto con múltiples ventanas en diferentes directorios, puede tener múltiples terminales abiertas y cada una ejecuta un shell que tiene su propio directorio de trabajo actual e independiente.
Entonces, cuando escribes pwd
en una terminal (o cwd
como se llame el comando en tu lenguaje de comandos), el resultado dependerá en gran medida de lo que hiciste en esa ventana o proceso antes, y probablemente dependa de cómo creaste esa ventana o proceso. . En muchos sistemas tipo Unix, cuando crea una nueva ventana de terminal con un proceso de shell asociado, se abre originalmente en su directorio de inicio ( /home/you
en muchos sistemas Unix, /Users/you
en una Mac, algo más o menos como C:\Users\you
en Windows reciente), aunque probablemente su El terminal se puede configurar para que se abra en otro lugar (comúnmente Desktop
o Documents
dentro de su directorio personal en algunos sistemas aparentemente "modernos" y "amigables").
Muchos principiantes tienen un modelo mental vago e incompleto de lo que sucede cuando ejecutan un programa. Muchos entran incesantemente cd
en cualquier directorio que contenga su script o programa y se asustan y confunden genuinamente cuando les dices que no es necesario. Si frobozz
está dentro /home/you/bin
, entonces no tienes que hacerlo.
cd /home/you/bin
./frobozz
porque simplemente puedes ejecutarlo directamente con
/home/you/bin/frobozz
y del mismo modo si ls
está en /bin
ti definitivamente no lo hagas
cd /bin
./ls
sólo para obtener un listado del directorio.
Además, como el ejemplo ls
(o en Windows dir
) debería convencerlo fácilmente, cualquier programa que ejecute buscará archivos en su directorio actual. No el directorio en el que se guardó el programa o script. Porque si ese fuera el caso, ls
solo podría producir una lista del directorio en el que se encuentra ( /bin
); no hay nada especial en el programa de lista de directorios, ni en el programa de copia, ni en la palabra programa de procesador; todos ellos, por diseño, buscan en el directorio de trabajo actual (aunque nuevamente, algunos programas GUI comenzarán con , por ejemplo, su Documents
directorio como su directorio de trabajo actual, por diseño, al menos si no les dice lo contrario).
Muchos principiantes escriben scripts que exigen que los archivos de entrada y salida estén en un directorio particular dentro del directorio de inicio de un usuario en particular, pero esto es simplemente un diseño deficiente; un programa bien escrito simplemente buscará en el directorio de trabajo actual sus archivos de entrada a menos que se le indique lo contrario, y escribirá la salida en el directorio actual (o tal vez creará un nuevo directorio en el directorio actual para su salida si consta de varios archivos).
Python, entonces, no es diferente de cualquier otro programa. Si su directorio de trabajo actual es /Users/you/Documents
cuando ejecuta, python
entonces ese directorio es lo que os.getcwd()
producirá su script o intérprete de Python (a menos que lo separe os.chdir()
en un directorio diferente durante el tiempo de ejecución; pero nuevamente, esto probablemente sea innecesario y, a menudo, es una señal de que se escribió un script). por un principiante). Y si su secuencia de comandos Python acepta un parámetro de nombre de archivo, probablemente debería simplemente hacer que el sistema operativo acceda a open
lo que ingresó el usuario, lo que significa que los nombres de archivos relativos son relativos al directorio de trabajo actual del usuario que invoca.
python /home/you/bin/script.py file.txt
debería simplemente open(sys.argv[1])
fallar con un error si file.txt
no existe en el directorio actual. Digámoslo de nuevo; no busca /home/you/bin
, file.txt
a menos, por supuesto, que también sea el directorio de trabajo actual de usted, el usuario que invoca, en cuyo caso, por supuesto, simplemente podría escribir
python script.py file.txt
En una nota relacionada, muchos principiantes prueban innecesariamente algo como
with open(os.path.join(os.getcwd(), "input.txt")) as data:
...
que llama innecesariamente os.getcwd()
. ¿Por qué es innecesario? Si lo ha seguido, ya sabe la respuesta: el sistema operativo buscará nombres de archivos relativos (como aquí input.txt
) en el directorio de trabajo actual de todos modos. Entonces todo lo que necesitas es
with open("input.txt") as data:
...
Una última observación. En sistemas tipo Unix, todos los archivos están en última instancia dentro del directorio raíz /
que contiene una serie de otros directorios (y normalmente los usuarios normales no pueden escribir nada allí, y los administradores del sistema con el privilegio de hacerlo normalmente no quieren hacerlo). . Cada nombre de archivo relativo se puede convertir en un nombre de archivo absoluto rastreando la ruta desde el directorio raíz hasta el directorio actual. Entonces, si el archivo al que queremos acceder está en /home/you/Documents/file.txt
significa que home
está en el directorio raíz y contiene you
, que contiene Documents
, que contiene file.txt
. Si su directorio de trabajo actual fuera su directorio de trabajo actual, /home
podría hacer referencia al mismo archivo mediante la ruta relativa you/Documents/file.txt
; y si su directorio actual fuera /home/you
, la ruta relativa al mismo sería Documents/file.txt
(y si su directorio actual fuera, /home/you/Music
podría decirlo ../Documents/file.txt
, pero no llevemos este ejemplo más lejos ahora).
Windows tiene una disposición ligeramente diferente, con varias unidades con identificadores de una sola letra, cada una con su propio directorio raíz; entonces la raíz de la unidad C: es C:\
y la raíz de la unidad D: es, D:\
etc. (y el separador de directorio es una barra invertida en lugar de una barra inclinada, aunque puedes usar una barra diagonal en casi todas partes, lo cual suele ser una buena idea). para preservar su cordura).
La ubicación de su intérprete de Python se basa en cómo lo inició, así como en las acciones posteriores tomadas después de iniciarlo, como el uso del módulo del sistema operativo para navegar por su sistema de archivos. Simplemente iniciar el intérprete lo ubicará en el directorio de su instalación de Python (no es lo mismo en diferentes sistemas operativos). Por otro lado, si comienzas editando o ejecutando un archivo dentro de un directorio específico, tu ubicación será la carpeta del archivo que estabas editando. Si necesita ejecutar el intérprete en un directorio determinado y está utilizando inactivo, por ejemplo, es más fácil comenzar creando un archivo Python allí de una forma u otra y cuando lo edite puede iniciar un shell con Ejecutar > Python Shell que ya estará en ese directorio. Si está utilizando el intérprete de línea de comandos, navegue hasta la carpeta donde desea ejecutar su intérprete antes de ejecutar el comando python/python3/py. Si necesita navegar manualmente, por supuesto puede utilizar lo siguiente que ya se ha mencionado:
import os
os.chdir('full_path_to_your_directory')
Esto no tiene nada que ver con OSX en particular, es más bien un concepto compartido por todos los sistemas basados en Unix, y creo que Windows también. os.getcwd()
es el equivalente al pwd
comando bash: simplemente devuelve la ruta completa de la ubicación actual en la que se encuentra. En otras palabras:
alex@suse:~> cd /
alex@suse:/> python
Python 2.7.12 (default, Jul 01 2016, 15:34:22) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/'
Depende de dónde inició el shell/script de Python.
Generalmente se puede acceder a Python (excepto si está trabajando con entornos virtuales) desde cualquiera de sus directorios. Puede verificar las variables en su ruta y Python debería estar disponible. Entonces, el directorio que obtienes cuando le preguntas a Python es aquel en el que iniciaste Python. Cambie el directorio en su shell antes de iniciar Python y verá que el resultado que obtendrá cambiará en consecuencia.