python路徑問題

問題描述

最近利用python構(gòu)建工作腳本的時候,需要把混用之前的shell腳本曹动。但是在互相調(diào)用的時候谚中,發(fā)現(xiàn)原本運行完好的python腳本出現(xiàn)了尋找文件上的問題。

python腳本中林艘,利用了ConfigParser模塊來使用config文件盖奈。

# ...
config = ConfigParser.ConfigParser()
config.read("config.ini")
# ...

config.ini文件和這個python腳本處于同一目錄中,因此單獨運行此腳本的時候狐援,沒有任何問題钢坦。

之后究孕,由于需要在一個shell腳本中使用這個腳本,而shell腳本在另一個目錄中爹凹,這個時候就出現(xiàn)了找不到文件的問題厨诸,表現(xiàn)為config解析錯誤。因此禾酱,這里我使用了腳本文件的路徑來試圖補全config文件的路徑微酬。

# ...
config = ConfigParser.ConfigParser()
config.read(os.path.dirname(sys.argv[0]) + "config.ini")
# ...

暫時這個文件表現(xiàn)良好。但是隨后這個python文件需要調(diào)用同一文件夾下的另一個模塊宇植,這個模塊中也使用了config文件得封,因此如法炮制,我又使用了上面的方法來加載config.ini指郁,結(jié)果發(fā)生了之前同樣的錯誤忙上。經(jīng)過在網(wǎng)上研究,最終改成如下形式:

# ...
config = ConfigParser.ConfigParser()
config.read(os.path.dirname(os.path.realpath(__file__)) + "config.ini")
# ...

這樣最終達(dá)成了需求闲坎。

原理分析

最開始使用的方法是使用系統(tǒng)搜索路徑直接尋找這個文件疫粥,在該目錄中使用的時候沒問題,因為python會將sys.argv[0]自行加入sys.path中腰懂。因此可以尋找到本目錄的文件梗逮。但是換一個目錄就找不到這個文件了,因此報錯绣溜。

第二次使用sys.argv[0]尋找文件慷彤。在被其他模塊使用的時候,sys.argv[0]會變成只有文件名沒有路徑的形式怖喻,因此找不到文件底哗。

第三次使用__file__,這個是直指本文件路徑的锚沸,因此可以使用跋选。

相關(guān)擴展

os模塊的使用

os.sep 可以取代操作系統(tǒng)特定的路徑分割符。

os.name字符串指示你正在使用的平臺哗蜈。比如對于Windows前标,它是'nt',而對于Linux/Unix用戶距潘,它是'posix'炼列。

os.getcwd()函數(shù)得到當(dāng)前工作目錄,即當(dāng)前Python腳本工作的目錄路徑音比。

os.getenv()和os.putenv()函數(shù)分別用來讀取和設(shè)置環(huán)境變量唯鸭。

os.listdir()返回指定目錄下的所有文件和目錄名。

os.remove()函數(shù)用來刪除一個文件硅确。

os.system()函數(shù)用來運行shell命令目溉。

os.linesep字符串給出當(dāng)前平臺使用的行終止符。例如菱农,Windows使用'\r\n'缭付,Linux使用'\n'而Mac使用'\r'。

os.path.split()函數(shù)返回一個路徑的目錄名和文件名循未。

os.path.isfile()和os.path.isdir()函數(shù)分別檢驗給出的路徑是一個文件還是目錄陷猫。

os.path.existe()函數(shù)用來檢驗給出的路徑是否真地存在

os和os.path模塊

os.listdir(dirname):列出dirname下的目錄和文件

os.getcwd():獲得當(dāng)前工作目錄

os.curdir:返回但前目錄('.')

os.chdir(dirname):改變工作目錄到dirname

os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false

os.path.isfile(name):判斷name是不是一個文件的妖,不存在name也返回false

os.path.exists(name):判斷是否存在文件或目錄name

os.path.getsize(name):獲得文件大小绣檬,如果name是目錄返回0L

os.path.abspath(name):獲得絕對路徑

os.path.normpath(path):規(guī)范path字符串形式

os.path.split(name):分割文件名與目錄(事實上,如果你完全使用目錄嫂粟,它也會將最后一個目錄作為文件名而分離娇未,同時它不會判斷文件或目錄是否存在)

os.path.splitext():分離文件名與擴展名

os.path.join(path,name):連接目錄與文件名或目錄

os.path.basename(path):返回文件名

os.path.dirname(path):返回文件路徑

os.path.realpath():返回文件的路徑

sys模塊的使用

sys.argv 一個包含了腳本名稱和傳入?yún)?shù)的list

sys.path 搜索路徑的list星虹,可以通過插入路徑的方式添加搜索路徑零抬。

sys.builtin_module_names 所有的內(nèi)建模塊。

sys.modules 所有已經(jīng)導(dǎo)入的模塊宽涌。

sys.platform 系統(tǒng)平臺平夜。

sys.stdout 標(biāo)準(zhǔn)輸出。

sys.stderr 標(biāo)準(zhǔn)錯誤輸出卸亮。

sys.exit 退出程序忽妒。

sys.exitfunc 退出程序的時候調(diào)用的函數(shù),可以自己替換兼贸。

常用python模塊的私有變量

__file__該腳本的路徑

__name__該腳本的名稱段直。直接調(diào)用這個腳本的時候會被給一個省缺值__main__∏奘埽可以借此判斷執(zhí)行方式和編寫單元測試坷牛。

__doc__這個對象的描述。在模塊起始或者類起始用形如

"""
description
"""

這樣的方式寫出的描述文字很澄。

三種獲取路徑方式的區(qū)別

在之前的介紹中京闰,涉及到了三種獲取路徑的方式。分別是os.getcwd()甩苛,__file__sys.argv[0]蹂楣。這三種方式在直接使用腳本的時候返回是基本一致的。但是也有區(qū)別讯蒲。

os.getcwd()獲得的是當(dāng)前工作目錄的路徑痊土。與腳本所在路徑可能不一致。

__file__則是腳本的文件名墨林,有時是絕對路徑赁酝,有時是相對路徑犯祠,但是都指向了使用該變量的腳本。

sys.argv[0]是調(diào)用腳本的時候使用的文件名酌呆。其實相當(dāng)于調(diào)用python命令的時候的第一個參數(shù)衡载。因此,有時候可能沒有路徑只有文件名隙袁。

在使用文件名之前一定要分辨清楚痰娱,否則可能會有這次一樣,時有時無的報錯菩收。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梨睁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娜饵,更是在濱河造成了極大的恐慌坡贺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件划咐,死亡現(xiàn)場離奇詭異拴念,居然都是意外死亡,警方通過查閱死者的電腦和手機褐缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門政鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人队魏,你說我怎么就攤上這事公般。” “怎么了胡桨?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵官帘,是天一觀的道長。 經(jīng)常有香客問我昧谊,道長刽虹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任呢诬,我火速辦了婚禮涌哲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尚镰。我一直安慰自己阀圾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布狗唉。 她就那樣靜靜地躺著初烘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肾筐,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天哆料,我揣著相機與錄音,去河邊找鬼吗铐。 笑死剧劝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抓歼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拢锹,長吁一口氣:“原來是場噩夢啊……” “哼谣妻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卒稳,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹋半,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后充坑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體减江,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年捻爷,在試婚紗的時候發(fā)現(xiàn)自己被綠了辈灼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡也榄,死狀恐怖巡莹,靈堂內(nèi)的尸體忽然破棺而出轩勘,到底是詐尸還是另有隱情算凿,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布挎扰,位于F島的核電站囚霸,受9級特大地震影響腰根,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拓型,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一额嘿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨述,春花似錦岩睁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春刘莹,著一層夾襖步出監(jiān)牢的瞬間阎毅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工点弯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扇调,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓抢肛,卻偏偏與公主長得像狼钮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捡絮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 參考:http://blog.csdn.net/wuce_bai/article/details/50827393...
    Babyzpj閱讀 808評論 0 0
  • 模塊和包 一 模塊 1 什么是模塊福稳? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件涎拉,文件名就是...
    go以恒閱讀 2,274評論 0 4
  • 常用模塊 認(rèn)識模塊 什么是模塊 什么是模塊鼓拧? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文...
    go以恒閱讀 1,953評論 0 6
  • 1.os模塊(功能類似操作系統(tǒng)與文件交互) 1.常用模塊功能 1.創(chuàng)建文件 1.mkdir 2.移除文件 1.re...
    25歲學(xué)Python閱讀 159評論 0 2
  • 肖巧風(fēng) 焦點解決初級網(wǎng)絡(luò)班第21期 堅持第3天原創(chuàng)分享 總約練第4次 2020年1月27日星期一晴農(nóng)歷一月初三 ...
    鳳舞九天閱讀 429評論 0 0