Pythonで論理ディレクトリパスを取得/設定する方法
質問
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 を呼び出すまでしか機能しません。
解決
基礎となるオペレーティング システム/シェルは、実際のパスを Python に報告します。
したがって、実際にはそれを回避する方法はありません。 os.getcwd()
C ライブラリへのラップされた呼び出しです 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.
他のヒント
これは私にとってもうまくいきます:
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 メソッドを使用します。乾杯!
所属していません StackOverflow