如何在python中获取/设置逻辑目录路径
时间:2020-03-06 14:37:42 来源:igfitidea点击:
在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']。如果设置了该环境变量,则可以创建一些尊重它的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.

