如何在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之前有效。
2 个回答
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这个方法。谢谢!
13
底层的操作系统或命令行会把真实的路径报告给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.