[英]Python - Getting calling module's path via traceback, problems?
在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__)
类的调用,但是如果没有真正的理由避免使用更简单的界面,那么我更愿意使用它。
要查找模块,函数或类的位置,请使用inspect
模块:
import inspect
print(inspect.getsourcefile(some_module))
您可以使用它来查找您感兴趣的代码单元的位置。如果将其放在库中,只需将其包装在带有参数的函数中即可。
实际上,如果需要,您可以使用__file__
进行相同的操作:只需将其作为参数传递给将完成其余工作的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.