¿Qué es exactamente el directorio de trabajo actual?

Resuelto M.Hamel asked hace 7 años • 5 respuestas

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?

M.Hamel avatar Aug 09 '17 20:08 M.Hamel
Aceptado

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.txtque estaba en el directorio spring_semesterque a su vez estaba en el directorio 2021que estaba en el directorio studiesen 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í cdnació 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 cda 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 pwden una terminal (o cwdcomo 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/youen muchos sistemas Unix, /Users/youen una Mac, algo más o menos como C:\Users\youen Windows reciente), aunque probablemente su El terminal se puede configurar para que se abra en otro lugar (comúnmente Desktopo Documentsdentro 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 cden cualquier directorio que contenga su script o programa y se asustan y confunden genuinamente cuando les dices que no es necesario. Si frobozzestá 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 lsestá en /binti 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, lssolo 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 Documentsdirectorio 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/Documentscuando ejecuta, pythonentonces 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 openlo 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.txtno existe en el directorio actual. Digámoslo de nuevo; no busca /home/you/bin, file.txta 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.txtsignifica que homeestá 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, /homepodrí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/Musicpodrí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).

tripleee avatar Mar 29 '2021 20:03 tripleee

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')
Evan avatar Aug 09 '2017 13:08 Evan

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 pwdcomando 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.

Alexander Ejbekov avatar Aug 09 '2017 13:08 Alexander Ejbekov

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.

Coding thermodynamist avatar Aug 09 '2017 13:08 Coding thermodynamist