2010-03-29 81 views
6

在Perl中,FindBin模塊用於查找原始腳本的目錄。在Python中獲取這個目錄的規範方法是什麼?什麼是Perl的FindBin的Python等價物?

一些我見過的選項:

  • os.path.dirname(os.path.realpath(sys.argv[0]))
  • os.path.abspath(os.path.dirname(sys.argv[0]))
  • os.path.abspath(os.path.dirname(__file__))
+0

不要使用FindBin:http://www.perlmonks.org/?node_id=41213 – runrig 2010-03-30 14:59:35

+4

perlmonks投訴是陳舊和過時的。 FindBin的創建是因爲在/ proc/PID/exe出現之前,需要啓發式來查找當前可執行文件的路徑。抱怨者有一種啓發式的方法,這種方法通常但並不總是奏效。據報道,最終,FindBin的啓發式算法得到了改進。現在,它在可用時使用/ proc/PID/exe,在這樣的系統上,它比perlmonks討論中的投訴更可靠。 – 2012-01-27 20:32:57

+0

讓我添加我關於FindBin仍然有用的3年以上的舊評論 - 足夠有用,Perl FindBin現在位於核心perl發行版中:恕我直言比FindBin更有用的是CPAN的Dir :: Self,它創建了僞常量__DIR__,擴展到您的源文件所在的目錄(絕對)。 FindBin僅適用於可執行文件; __DIR__適用於任何模塊。 – 2016-03-08 23:44:20

回答

6

我不使用Python很多時候,所以我不知道是否有包如FindBin但是

import os 
import sys 
bindir = os.path.abspath(os.path.dirname(sys.argv[0])) 

應該工作。

+0

我認爲在Perl中使用'FindBin'而不是$ 0就是找到腳本,即使它是通過鏈接訪問的。 sys.argv [0]幾乎與$ 0相同,並且不適用於鏈接。 – 2014-05-08 11:09:47

+0

對不起,我錯了。兩者都不適用於鏈接。 – 2014-05-08 11:15:15

+0

Perl FindBin和Dir :: Self _ _DIR_ _的一個主要用途是相對於腳本或模塊加載模塊。正如在「使用lib _ _DIR_ _」或「使用lib $ FindBin :: RealBin」一樣,據我所知,Python的接受答案不能以這種方式使用。 //接受的Python答案可以用來相對產生可執行文件。 – 2016-03-09 00:42:00

12

你可以試試這個:

import os 
bindir = os.path.abspath(os.path.dirname(__file__)) 

這會給你當前文件的目錄的絕對路徑。

0

要更新以前的答案,與Python 3.4+,你現在可以做的:

import pathlib 
bindir = pathlib.Path(__file__).resolve().parent 

,這將給你相同的,除了你會得到一個路徑對象,方式更漂亮的工作用。

相關問題