如何在python中获取/设置逻辑目录路径
问题描述:
在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时才有效。
答
底层操作系统/ shell报告python的真实路径。
所以,真的没有办法解决它,因为os.getcwd()
是C库getcwd()
功能的封装调用。
有一些你已经知道启动pwd
的精神的一些解决方法。
另一个涉及使用os.environ['PWD']
。如果该环境变量已设置,则可以创建一些尊重该变量的函数。
该解决方案如下结合了:
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 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'
获取环境可变的PWD并不总是为我工作,所以我使用popen方法。干杯!
谢谢! getcwd()需要一个自我论证 - 除了它完美的工作! – Moe 2008-09-23 21:50:47