Cómo obtener/establecer la ruta del directorio lógico en python


7

En python es posible obtener o establecer un directorio lógico (en lugar de uno absoluto).

Por ejemplo, si tengo:

/real/path/to/dir 

y tengo

/linked/path/to/dir 

también con el mismo directorio.

usando os.getcwd y os.chdir siempre utilizará la ruta absoluta

>>> import os 
>>> os.chdir('/linked/path/to/dir') 
>>> print os.getcwd() 
/real/path/to/dir 

La única manera que he encontrado para evitar esto en absoluto es poner en marcha 'pwd' en otro proceso y leer la salida . Sin embargo, esto solo funciona hasta que llame a os.chdir por primera vez.

11

El sistema operativo/shell subyacente informa sobre las rutas de acceso reales a python.

Por lo tanto, realmente no hay forma de evitarlo, ya que os.getcwd() es una llamada envuelta a la función C Library getcwd().

Hay algunas soluciones en el espíritu de la que ya sabe que está lanzando pwd.

Otra implicaría el uso de os.environ['PWD']. Si esa variable de entorno está configurada, puede realizar alguna función getcwd que la respete.

La solución a continuación combina ambos:

import os 
from subprocess import Popen, PIPE 

class CwdKeeper(object): 
    def __init__(self): 
     self._cwd = os.environ.get("PWD") 
     if self._cwd is None: # no environment. fall back to calling pwd on shell 
      self._cwd = Popen('pwd', stdout=PIPE).communicate()[0].strip() 
     self._os_getcwd = os.getcwd 
     self._os_chdir = os.chdir 

    def chdir(self, path): 
     if not self._cwd: 
      return self._os_chdir(path) 
     p = os.path.normpath(os.path.join(self._cwd, path)) 
     result = self._os_chdir(p) 
     self._cwd = p 
     os.environ["PWD"] = p 
     return result 

    def getcwd(self): 
     if not self._cwd: 
      return self._os_getcwd() 
     return self._cwd 

cwd = CwdKeeper() 
print cwd.getcwd() 
# use only cwd.chdir and cwd.getcwd from now on.  
# monkeypatch os if you want: 
os.chdir = cwd.chdir 
os.getcwd = cwd.getcwd 
# now you can use os.chdir and os.getcwd as normal. 
  0

Gracias! getcwd() necesita un auto argumento, ¡aparte de que funciona perfectamente! 23 sep. 082008-09-23 21:50:47

  0

bien, arreglado, gracias. 23 sep. 082008-09-23 23:09:47


1

Esto también hace el truco para mí:

import os 
os.popen('pwd').read().strip('\n') 

Aquí es una manifestación en Python Shell:

>>> import os 
>>> os.popen('pwd').read() 
'/home/projteam/staging/site/proj\n' 
>>> os.popen('pwd').read().strip('\n') 
'/home/projteam/staging/site/proj' 
>>> # Also works if PWD env var is set 
>>> os.getenv('PWD') 
'/home/projteam/staging/site/proj' 
>>> # This gets actual path, not symlinked path 
>>> import subprocess 
>>> p = subprocess.Popen('pwd', stdout=subprocess.PIPE) 
>>> p.communicate()[0] # returns non-symlink path 
'/home/projteam/staging/deploys/20150114-141114/site/proj\n' 

Conseguir el medio ambiente La variable PWD no siempre me funciona, así que utilizo el método popen. ¡Aclamaciones!