Python - 通过追溯获取调用模块的路径,问题?

时间:2015-11-04 23:04:00

标签: python module path traceback

在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__)这样的电话,但如果没有实际的理由避免使用更简单的界面,那么我更愿意使用它。

1 个答案:

答案 0 :(得分:0)

要查找模块,函数或类的位置,请使用inspect模块:

import inspect
print(inspect.getsourcefile(some_module))

您可以使用它来查找您感兴趣的代码单元的位置。如果将它放在库中,只需将其包装在带参数的函数中。

实际上,如果需要,您可以对__file__执行相同操作:只需将其作为参数传递给将执行其余操作的函数。