Wie kommt man / set logischen Verzeichnispfad in Python
Frage
In Python ist es möglich, ein logisches Verzeichnis zu erhalten oder zu setzen (im Gegensatz zu einem absoluten einem gegen).
Zum Beispiel, wenn ich:
/real/path/to/dir
, und ich habe
/linked/path/to/dir
in das gleiche Verzeichnis verknüpft.
mit os.getcwd und os.chdir immer den absoluten Pfad verwenden
>>> import os
>>> os.chdir('/linked/path/to/dir')
>>> print os.getcwd()
/real/path/to/dir
Die einzige Möglichkeit, die ich gefunden habe, um dies überhaupt zu bekommen ist ‚PWD‘ in einem anderen Prozess zu starten und die Ausgabe zu lesen. Doch nur dies funktioniert, bis Sie os.chdir zum ersten Mal aufrufen.
Lösung
Das zugrunde liegende Betriebssystem / Shell meldet reale Wege zu Python.
Also, es gibt wirklich keinen Weg darum herum, da os.getcwd()
einen eingewickelt Aufruf C Library getcwd()
Funktion ist.
Es gibt einige Workarounds im Geist des einen, die Sie bereits wissen, welche pwd
starten.
Eine andere würde bedeuten, os.environ['PWD']
verwenden. Wenn das environmnent Variable gesetzt können Sie einige getcwd
Funktion machen, dass sie respektiert.
Die Lösung unten kombiniert beides:
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.
Andere Tipps
Dies ist auch der Trick für mich:
import os
os.popen('pwd').read().strip('\n')
Hier ist eine Demonstration in 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'
Getting die Umgebungsvariable PWD hat nicht immer funktioniert für mich so verwende ich die popen Methode. Cheers!