Python:如果目录是符号链接,则getcwd和pwd给出不同的结果

时间:2019-02-13 07:52:32

标签: python hyperlink path directory absolute

如果我的工作目录是符号链接,则os.getcwd()os.system("pwd")不会给出相同的结果。我想使用os.path.abspath(".")来获得我的工作目录(或其中的文件)的完整路径,目的是为了获得与os.path.realpath(".")相同的结果。

如何在python 2.7中获得类似os.path.abspath(".", followlink=False)的东西?

示例:/ tmp是/ private / tmp的符号链接

cd /tmp
touch toto.txt
python
print os.path.abspath("toto.txt")
--> "/private/tmp/toto.txt"
os.system("pwd")
--> "/tmp"
os.getcwd()
--> "/private/tmp"

如何从相对路径“ toto.txt”中获取“ /tmp/toto.txt”?

2 个答案:

答案 0 :(得分:1)

如果要使用os.system(),请使用 os.system(“ pwd -L”)获取当前工作目录的逻辑路径。

如果从bash shell运行,则可以使用 os.environ [“ PWD”] ,而无需运行系统。

但是这两种解决方案都假定您位于文件所在的目录中

基于Eric H的界面:

import os,subprocess
def abspath(pathname):
    '''Return logical path (not physical) for pathname using Popen'''
    if pathname[0]=="/":
        return pathname
    lpwd = subprocess.Popen(["pwd","-L"],stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
    return(os.path.join(lpwd,pathname))

def abspathenv(pathname):
    '''Return logical path (not physical) for pathname using bash $PWD'''
    if pathname[0]=="/":
        return pathname
    return(os.path.join(os.environ["PWD"],pathname))

print(abspath("foo.txt"))
print(abspathenv("foo.txt"))

答案 1 :(得分:0)

解决方案是:

from subprocess import Popen, PIPE

def abspath(pathname):
    """ Returns absolute path not following symbolic links. """
    if pathname[0]=="/":
        return pathname
    # current working directory
    cwd = Popen("pwd", stdout=PIPE, shell=True).communicate()[0].strip()
    return os.path.join(cwd, pathname)

print os.path.abspath("toto.txt")  # --> "/private/tmp/toto.txt"
print abspath("toto.txt")          # --> "/tmp/toto.txt"