Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从已执行但未声明的函数中获取模块的文件路径?_Python_Filepath - Fatal编程技术网

Python 如何从已执行但未声明的函数中获取模块的文件路径?

Python 如何从已执行但未声明的函数中获取模块的文件路径?,python,filepath,Python,Filepath,如果我想要当前模块的路径,我将使用\uuuu文件\uuu 现在让我们假设我想要一个函数来返回它。我做不到: def get_path(): return __file__ 因为它将返回函数已在中声明的模块的路径 即使函数不是在模块的根上调用的,而是在任何嵌套级别调用的,我也需要它工作。从全局文件中获取它在这种情况下: def get_path(): return globals()['__file__'] 根据注释进行编辑:给定以下文件: # a.py def get_pat

如果我想要当前模块的路径,我将使用
\uuuu文件\uuu

现在让我们假设我想要一个函数来返回它。我做不到:

def get_path():
    return __file__
因为它将返回函数已在中声明的模块的路径


即使函数不是在模块的根上调用的,而是在任何嵌套级别调用的,我也需要它工作。

全局文件中获取它在这种情况下:

def get_path():
    return globals()['__file__']
根据注释进行编辑:给定以下文件:

# a.py
def get_path():
    return 'Path from a.py: ' + globals()['__file__']

# b.py
import a

def get_path():
    return 'Path from b.py: ' + globals()['__file__']

print get_path()
print a.get_path()
运行此命令将获得以下输出:

C:\workspace>python b.py
Path from b.py: b.py
Path from a.py: C:\workspace\a.py

除了绝对/相对路径不同之外(为了简单起见,让我们忽略这一点),我觉得它很不错。

我找到了一种使用inspect模块的方法。我同意这个解决方案,但如果有人能找到一种方法,在不倾倒整个stacktrace的情况下完成它,它会更干净,我会感激地接受他的回答:

def get_path():
    frame, filename, line_number, function_name, lines, index =\
        inspect.getouterframes(inspect.currentframe())[1]
    return filename

我会这样做:

import sys

def get_path():
    namespace = sys._getframe(1).f_globals  # caller's globals
    return namespace.get('__file__')

您想要的是有点像欺骗普通Python模块处理。也许你可以用一个不同的问题来说明你真正的问题,看看是否有一种更像蟒蛇的方式来做你真正想做的事情?@e-satis我很好奇,如果你只是把
\uuuu file\uuuuu
传递到
def get\u path(path):return path
?@erikb85:我很感谢你的帮助,但是在这种情况下,我确切地知道我想做什么,以及它的利弊。@Kay Zhu:是的,但我的目的是创造一个速记,它不会很好,必须这样做。你试过了吗?这将得到与返回文件相同的结果。我得到了与Kay Zhu相同的结果,真的吗?给定所述的确切代码?这似乎与事实相矛盾。引用:返回表示当前全局符号表的字典。这始终是当前模块的字典(在函数或方法中,这是定义它的模块,而不是调用它的模块)。(强调我的)。@jro-请再读一遍问题。e-satis查找的是调用模块的路径,而不是定义模块。@Gil:找到了,谢谢。由于e-satis已经回答了他自己的问题,我把这个问题留给那些误解它的人,就像我一样:)。啊,我想我现在明白你的问题了,多亏了@Gil。另一种方法可能是调用
traceback.extract_stack()[0][0]
?一种稍微简单的方法是使用
def get_path():return inspect.stack()[1][1]
,尽管这会将整个stacktrace转储为well@jro:extract_stack是否也会转储整个stacktrace?@e-satis:您可以调用函数。我想这会阻止痕迹的进一步移动,但是我没有事实来证明这一点。getframe是处理整个帧堆栈还是只选择它需要的帧?它只返回调用堆栈上的一个帧给它的调用方。我应该说,在这种情况下,它只是返回一个帧,因为传递给它的
1
参数。