| 導航:起始頁 > Dive Into Python > 函數編程 > 找到路徑 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
從命令行運行 Python 代碼時,知道所運行代碼在磁盤上的存儲位置有時候是有必要的。
這是一個不那么容易想起,但一想起就很容易解決的小麻煩。答案是 sys.argv。正如你在 第 9 章 XML 處理 中看到的,它包含了很多命令行參數。它也同樣記錄了運行腳本的名字,和你調用它時使用的命令一摸一樣。這些信息足以令我們確定文件的位置。
如果您還沒有下載本書附帶的樣例程序, 可以 下載本程序和其他樣例程序。
import sys, os print 'sys.argv[0] =', sys.argv[0]pathname = os.path.dirname(sys.argv[0])
print 'path =', pathname print 'full path =', os.path.abspath(pathname)
進一步地解釋 os.path.abspath 是有必要的。它非常靈活,可以接受任何類型的路徑名。
>>> import os >>> os.getcwd()/home/you >>> os.path.abspath('')
/home/you >>> os.path.abspath('.ssh')
/home/you/.ssh >>> os.path.abspath('/home/you/.ssh')
/home/you/.ssh >>> os.path.abspath('.ssh/../foo/')
/home/you/foo
| 傳遞給 os.path.abspath 的路徑名和文件名可以不存在。 | |
| os.path.abspath 不僅構建完整路徑名,還能格式化路徑名。這意味著如果你正工作于 /usr/ 目錄,os.path.abspath('bin/../local/bin') 將會返回 /usr/local/bin。它把路徑名格式化為盡可能簡單的形式。如果你只是希望簡單地返回這樣的格式化路徑名而不需要完整路徑名,可以使用 os.path.normpath。 | |
[you@localhost py]$ python /home/you/diveintopython/common/py/fullpath.pysys.argv[0] = /home/you/diveintopython/common/py/fullpath.py path = /home/you/diveintopython/common/py full path = /home/you/diveintopython/common/py [you@localhost diveintopython]$ python common/py/fullpath.py
sys.argv[0] = common/py/fullpath.py path = common/py full path = /home/you/diveintopython/common/py [you@localhost diveintopython]$ cd common/py [you@localhost py]$ python fullpath.py
sys.argv[0] = fullpath.py path = full path = /home/you/diveintopython/common/py
| 就像 os 和 os.path 模塊的其他函數,os.path.abspath 是跨平臺的。如果你是在 Windows (使用反斜杠作為路徑符號) 或 Mac OS (使用冒號) 上運行,它們同樣工作,只是將獲得與我稍有不同的結果。os 的所有函數都是這樣的。 | |
補充. 一位讀者對這個結果并不滿意,他希望能夠從當前路徑運行所有單元測試,而不是從 regression.py 所在目錄運行。他建議以下面的代碼加以取代:
import sys, os, re, unittest def regressionTest(): path = os.getcwd()sys.path.append(path)
files = os.listdir(path)
![]()
這個技術允許你在多個項目中重用 regression.py 代碼。只需要將這個代碼放在一個普通目錄中,在運行項目前將路徑更改為項目的目錄。項目中所有的單元測試被找到并運行,而不僅僅局限于 regression.py 所在目錄的單元測試。
<< 函數編程 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
重識列表過濾 >> |