10

Python では、絶対ディレクトリではなく、論理ディレクトリを取得または設定できます。

たとえば、私が持っている場合:

/real/path/to/dir

そして、私が持っています

/linked/path/to/dir

同じディレクトリにリンクされています。

os.getcwd と os.chdir を使用すると、常に絶対パスが使用されます

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

これを回避する唯一の方法は、別のプロセスで「pwd」を起動して出力を読み取ることです。ただし、これは os.chdir を初めて呼び出すまでしか機能しません。

4

2 に答える 2

13

基礎となる運用システム/シェルは、Python への実際のパスを報告します。

したがって、C ライブラリ関数os.getcwd()へのラップされた呼び出しであるため、これを回避する方法は実際にはありません。getcwd()

起動中の既知のものの精神に基づいたいくつかの回避策がありますpwd

もう 1 つは、 を使用することos.environ['PWD']です。その環境変数が設定されている場合は、getcwdそれを尊重する関数を作成できます。

以下のソリューションは、両方を組み合わせたものです。

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.
于 2008-09-23T21:22:43.443 に答える
1

これも私にとってはうまくいきます:

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

Python シェルでのデモは次のとおりです。

>>> 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'

環境変数 PWD の取得が常にうまくいくとは限らなかったので、popen メソッドを使用します。乾杯!

于 2015-01-14T20:09:30.537 に答える