2009-01-14 57 views
4

如何知道,在Python中,你是在目錄是一個符號鏈接裏面?怎麼知道,當你在一個符號鏈接

我有一個目錄的/ tmp /富/奇異果

我創建了一個符號鏈接的/ tmp /條指向的/ tmp/foo的

我進入的/ tmp /條/奇異果

linux命令PWD告訴我,我在的/ tmp /酒吧/奇異果,這是正確的。

蟒蛇命令提示符告訴我,我在的/ tmp /富/奇異果

Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32) 
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> os.getcwd() 
'/tmp/foo/kiwi' 

有沒有一種方法,在Python,讓我的目錄真的?

+0

呃,你真的在​​/ tmp/foo/kiwi,而不是「酒吧」。/bin/pwd(和os.getcwd())將報告「物理」位置,而不是「邏輯」位置。 – Keltia 2009-01-14 09:55:53

回答

6

如果你沒有找到任何東西,你可以用

os.getenv("PWD") 

這不是一個真正的便攜式蟒蛇方法,但它只是對POSIX系統。它得到PWD環境變量,它是由cd命令設置的運行python腳本前值(如果你不使用cd -P)爲您導航到路徑名(見man cd)。當然,這個變量不會被python改變。所以如果你在其他地方os.chdir,那個變量將保留它的價值。

不管怎樣,作爲一個邊節點,/tmp/foo/kiwi你是在目錄中。我不知道從什麼殼分開是否知悉你真的通過其他路徑進入那個地方航行,其實:)

+0

如果你做了一個os.chdir() - 或者任何等價的Python,從它環境繼承的$ PWD將不會改變... – Keltia 2009-01-14 10:11:24

+0

是的,它只適用於那些在他的環境中有PWD的情況,以獲得其初始值:) – 2009-01-14 10:18:30

+0

所以我會認爲這是不可能的便攜式方式。謝謝。 – Oli 2009-01-14 10:45:56

2

如果您的符號鏈接按照您的設置方式設置,那麼/tmp/foo/kiwi是您真正所在的目錄。/tmp/bar/kiwi只是到達同一位置的另一種方式。

注意,shell命令pwd -P會給你當前目錄的物理路徑。在你的情況下,殼是要記住,你有你在哪裏,通過bar符號鏈接,所以它告訴你,你是在/tmp/bar/kiwi

0

正如感興趣的事,如果你在一個目錄下,你可以使用-P選項來獲得pwd命令來解決所有的符號鏈接到他們的實際目錄。

$ ln -s Desktop toto 
$ cd toto 
$ 
$ pwd 
/home/ken/toto 
$ 
$ pwd -P 
/home/ken/Desktop 
$ 

HTH

歡呼聲,

羅布

0

你也可以嘗試LSTAT。它會給你關於文件/目錄的信息,包括告訴你它是否是一個鏈接,並顯示它鏈接到的位置。

0

當您的shell返回路徑時,它依賴於在遍歷符號鏈接路徑時設置的shell環境變量「PWD」,但實際上它在getcwd()返回的目錄下。所以,如果你從shell的PWD中獲得,你會得到你想要的。

 
>>> os.getcwd() 
'/home/ors/foo/tmp/foo/kiwi' 
>>> os.environ["PWD"] 
'/home/ors/foo/tmp/bar/kiwi' 
>>> 
0

這裏是另一種方式:

import os 
os.popen('pwd').read().strip('\n') 

這裏是在Python Shell演示:

>>> import os 
>>> os.popen('pwd').read().strip('\n') 
'/home/projteam/staging/site/proj' 
>>> # This returns actual 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方法。乾杯!

相關問題