在python中,我经常发现自己通过以下调用来加载包资源:
import os
fp = open(os.path.join(os.path.dirname(os.path.realpath(__file__)),
"resource.json"), "r")
我一直在考虑使用如下的库函数来消除这种丑陋。问题是该函数将存在于库中,而不是我想要获取目录的文件。我可以使用traceback包来解决这个问题,例如:
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"
,视情况而定。< / p>
然而,我担心这样做在某种程度上是危险的。手动查看堆栈跟踪感觉就像一个普遍的坏事,就像我打破封装一样。但我无法想到任何具体问题,所以我提出了一个问题:有人能想到这样做可以创造出一个问题吗?出于任何特定原因这是不好的做法吗?
注意:我意识到我可以强制用户拨打with_module_path("resource.json", __file__)
这样的电话,但如果没有实际的理由避免使用更简单的界面,那么我更愿意使用它。
答案 0 :(得分:0)
要查找模块,函数或类的位置,请使用inspect
模块:
import inspect
print(inspect.getsourcefile(some_module))
您可以使用它来查找您感兴趣的代码单元的位置。如果将它放在库中,只需将其包装在带参数的函数中。
实际上,如果需要,您可以对__file__
执行相同操作:只需将其作为参数传递给将执行其余操作的函数。