查找上一个函数在栈上的路径python

Find the path of the previous function on the stack python

我正在写一个通用打印 class:

from __future__ import division
import os.path

class pprint:
    def __init__(self, name, path=None):
        self.name = name
        if path == None:
            #Where we define the path
            ???
        self.path = path
        self.complete_name = os.path.join(path, name)
        self.f = open(complete_name, "w")

    def __call__(text):
        self.f.write(text + "\n")
        print text

构造函数采用要写入的文件名和包含该文件路径的可选参数。如果用户没有指定路径,我希望它写入调用程序的目录。我唯一不知道该怎么做的是后一个条件:如果没有指定路径,则假设该路径是调用函数的路径。
我如何找到这个?本质上,我想查看 python 函数堆栈,找出调用 pprint 的函数,找到该文件的路径,然后将 path 设置为该文件的路径.但是,我对 python 函数堆栈的工作原理一无所知。我该怎么做?
谢谢!

编辑:我不需要 __main__ 文件的路径。如果我有 a.py 调用 b.pyb.py 调用 pprint.py,我不需要 a.py 的路径。 a.pyb.py 的路径可能完全不同。

编辑 2:我正在使用 Python 2.7.6。如果相关的话,我在 Ubuntu 14.04。我使用内置的东西,附加了一些其他东西,如 numpy、scipy、pylab 等。我没有IDE。我使用 vim 和终端。编辑编辑:哎呀!正如一位 post 评论的那样,Ubuntu 内置 python IS CPython。我的错。所以,我正在使用 CPython...

您可以使用inspect.getouterframes获取调用者的框架,加上文件名和行号等

from __future__ import division

import inspect
import os.path

class pprint(object):
    def __init__(self, name, path=None):
        self.name = name
        if path == None:
           path = inspect.getouterframes(inspect.currentframe())[1][3] 

        self.path = path
        self.complete_name = os.path.join(path, name)
        self.f = open(complete_name, "w")
        ...

我假设您使用的是 Python 2.7CPython 或 Jython.