【问题标题】:Python - Getting calling module's path via traceback, problems?Python - 通过回溯获取调用模块的路径,有问题吗?
【发布时间】:2015-11-04 23:03:59
【问题描述】:

在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",根据需要。

但我担心这样做在某种程度上是危险的。手动查看堆栈跟踪感觉通常是一件坏事,就像我打破了封装一样。但是我想不出任何具体的问题,所以我提出了一个问题:任何人都可以想到这样做可能会产生的问题吗?出于任何特定原因,这是不好的做法吗?

注意:我知道我可以强制用户拨打with_module_path("resource.json", __file__) 之类的电话,但如果没有实际理由避免使用更简单的界面,那么我更愿意使用它。

【问题讨论】:

    标签: python module path traceback


    【解决方案1】:

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

    import inspect
    print(inspect.getsourcefile(some_module))
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2014-10-14
      • 2021-11-05
      • 2013-05-26
      • 1970-01-01
      相关资源
      最近更新 更多