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.

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top