Cómo get/set lógico ruta de acceso del directorio en python
Pregunta
En python es posible obtener o establecer una lógica de directorio (como opuesto a un valor absoluto).
Por ejemplo, si yo tengo:
/real/path/to/dir
y he
/linked/path/to/dir
vinculado en el mismo directorio.
el uso de 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 conseguir alrededor de esto es el lanzamiento de 'pwd' en otro proceso y leer la salida.Sin embargo, esto sólo funciona hasta que os llame.chdir por primera vez.
Solución
El subyacente del sistema operativo / shell informes de rutas reales para python.
Así que, realmente no hay manera alrededor de ella, ya que os.getcwd()
es una envuelto llamada a la Biblioteca de C getcwd()
la función.
Hay algunas soluciones en el espíritu de la que ya sabemos que está lanzando pwd
.
Otra sería implican el uso de os.environ['PWD']
.Si que environmnent se establece la variable que usted puede hacer algo getcwd
la función que la respete.
La solución a continuación combina:
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.
Otros consejos
Esto también hace el truco para mí:
import os
os.popen('pwd').read().strip('\n')
Aquí está una demostració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'
Obtención de la variable de entorno PWD no siempre funciona para mí, así que uso el popen método.Saludos!