So erhalten/setzen Sie den logischen Verzeichnispfad in Python


7

In Python ist es möglich, ein logisches Verzeichnis (im Gegensatz zu einem absoluten Verzeichnis) zu erstellen oder zu setzen. wenn

Zum Beispiel habe ich:

/real/path/to/dir 

und ich habe

/linked/path/to/dir 

in das gleiche Verzeichnis verknüpft.

os.getcwd und os.chdir mit immer den absoluten Pfad

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

Der einzige Weg, verwende ich gefunden habe, um dies überhaupt zu bekommen ist ‚PWD‘ in einem anderen Prozess zu starten und die Ausgabe lesen . Dies funktioniert jedoch nur bis zum ersten Aufruf von os.chdir.

11

Das zugrunde liegende Betriebssystem/Shell meldet reale Pfade zu Python.

So gibt es wirklich keine Möglichkeit, da os.getcwd() ist ein umgebrochener Aufruf an C-Bibliothek getcwd() Funktion.

Es gibt einige Problemumgehungen im Geiste desjenigen, den Sie bereits kennen, der pwd startet.

Eine andere wäre die Verwendung os.environ['PWD']. Wenn diese Umgebungsvariable gesetzt ist, können Sie eine getcwd Funktion erstellen, die dies berücksichtigt.

Die Lösung kombiniert unten beide:

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

Danke! getcwd() benötigt ein Selbstargument - anders als das es perfekt funktioniert! 23 sep. 082008-09-23 21:50:47

  0

okay, behoben, danke. 23 sep. 082008-09-23 23:09:47


1

Dies macht auch den 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' 

die Umwelt Anfahrt Variable PWD funktionierte nicht immer für mich, also verwende ich die Popen-Methode. Prost!