Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the symbolic path instead of real path?

Tags:

python

symlink

Suppose I have a path named:

/this/is/a/real/path

Now, I create a symbolic link for it:

/this/is/a/link  -> /this/is/a/real/path

and then, I put a file into this path:

/this/is/a/real/path/file.txt

and cd it with symbolic path name:

cd /this/is/a/link

now, pwd command will return the link name:

> pwd
/this/is/a/link

and now, I want to get the absolute path of file.txt as:

/this/is/a/link/file.txt

but with python's os.abspath() or os.realpath(), they all return the real path (/this/is/a/real/path/file.txt), which is not what I want.

I also tried subprocess.Popen('pwd') and sh.pwd() , but also get the real path instead of symlink path.

How can I get the symbolic absolute path with python?

Update

OK, I read the source code of pwd so I get the answer.

It's quite simple: just get the PWD environment variable.

This is my own abspath to satify my requirement:

def abspath(p):
    curr_path = os.environ['PWD']
    return os.path.normpath(os.path.join(curr_path, p))
like image 384
ch.linghu Avatar asked Jul 23 '13 08:07

ch.linghu


1 Answers

The difference between os.path.abspath and os.path.realpath is that os.path.abspath does not resolve symbolic links, so it should be exactly what you are looking for. I do:

/home/user$ mkdir test
/home/user$ mkdir test/real
/home/user$ mkdir test/link
/home/user$ touch test/real/file
/home/user$ ln -s /home/user/test/real/file test/link/file
/home/user$ ls -lR test

  test:
  d... link
  d... real

  test/real:
  -... file

  test/link:
  l... file -> /home/user/test/real/file

/home/user$ python

  ... python 3.3.2 ...
  >>> import os
  >>> print(os.path.realpath('test/link/file'))
  /home/user/test/real/file
  >>> print(os.path.abspath('test/link/file'))
  /home/user/test/link/file

So there you go. How are you using os.path.abspath that you say it resolves your symbolic link?

like image 55
Dan Gittik Avatar answered Oct 12 '22 17:10

Dan Gittik