2015-11-04 58 views
1

在Python中,我經常發現自己通過調用諸如以下裝載包資源:Python - 通過回溯獲取調用模塊的路徑,問題?

import os 
fp = open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 
         "resource.json"), "r") 

我一直在使用的庫函數考慮如下面消除這種醜陋。問題是該函數將存在於一個庫中,而不是我想要獲取該目錄的文件。我可以解決這個問題有回溯包,如下列要求:

import os, traceback 
def with_module_directory(filename): 
    return os.path.join(os.path.dirname(traceback.extract_stack()[-2][0]), 
         filename) 

現在,如果with_module_directory()生活/home/user1/mylibs/utils.py,當/home/user1/myscripts模塊使調用with_module_directory("resource.json"),其結果將是"/home/user1/myscripts/resource.json",根據需要。

我很擔心,但這樣做有些危險。手動查看堆棧跟蹤感覺就像一個普遍不好的事情,就像我打破封裝一樣。但我想不出任何具體問題,所以我提出了這樣一個問題:任何人都可以想到可以通過這樣做創建一個問題嗎?出於任何特定原因,這是不好的做法嗎?

注意:我意識到我可以強制用戶撥打電話with_module_path("resource.json", __file__),但如果沒有真正的理由避免更簡單的界面,我寧願使用它。

回答

0

要找到一個模塊,函數或類的位置,使用inspect模塊:

import inspect 
print(inspect.getsourcefile(some_module)) 

你可以用它來找到代碼單元您有興趣的位置,如果你把這個在一個庫中,只需將其包裝在一個帶參數的函數中即可。

實際上,如果需要,你可以對__file__做同樣的事情:只要將它作爲參數傳遞給一個函數,它將完成剩下的工作。