8

我很好奇是否可以访问导入其他模块的父模块的名称。

例如,如果我有一个模块(moduleA)并且父模块是模块,foo.py它将被导入其中,是否有可能moduleA知道它foo的位置?

模块A

def print_parent_module(): 
    os.path.asbpath(#somehow access filename of parent module) 

foo.py

import moduleA 

print moduleA.print_parent_module()
>>> "foo.py"
4

4 回答 4

4

我遇到了类似的问题。您可以使用__name__

parent_name = '.'.join(__name__.split('.')[:-1])

或者,如果您尝试直接访问模块(不是 OP 的问题,而是相关的),请参阅我在Is there a way to access parent modules in Python

于 2017-08-26T12:45:32.893 回答
1

不可以。导入的模块不包含任何形式的状态来存储与导入方式相关的数据。

我认为更好的问题是,你为什么要这样做呢?您知道如果foo.py确实是您的,__main__那么您可以轻松地从中获取名称foo.py(通过使用 sys.argv)?如果foo.py是一个导入的模块,那么您显然foo.py在导入它时已经知道它的名称及其位置等。

于 2013-09-22T20:10:09.083 回答
0

这是我用来存储父方法名称和变量的东西,以便稍后在类中使用装饰器调用。

import inspect
from functools import wraps

def set_reuse_vars(method):
    @wraps(method)
    def _impl(self, *method_args, **method_kwargs):
        func_current = inspect.currentframe()
        self.recall_func = dict()
        self.recall_func['method_kwargs'] = func_current.f_locals['method_kwargs']
        self.recall_func['method_name'] = func_current.f_locals['method'].__name__
        return method(self, *method_args, **method_kwargs)
    return _impl

class APIData(object):

    def __init__(self):
        self.client = None
        self.response = None
        self.recall_func = None

    def get_next_page(self):
        # Takes a pageToken to return the next result
        get_func = getattr(self, self.recall_func['method_name'])
        self.recall_func['method_kwargs']['pageToken'] = self.response['nextPageToken']
        return get_func(**self.recall_func['method_kwargs'])

    @set_reuse_vars
    def search_list_by_keyword(self, **kwargs):

        self.response = self.client.search().list(
            **kwargs
        ).execute()

        return self.response

脚本来运行它。

api_data = APIData()


results = api_data.search_list_by_keyword(
                       part='snippet',
                       maxResults=25,
                       order='date')


print(results)

resultsTwo = api_data.get_next_page()

print(resultsTwo)
于 2019-03-28T05:09:17.717 回答
-2

弄清楚了!

函数内部的一点 import 语句可以访问模块名称。

模块A

def print_module_name():
    import sys
    return sys.argv[0]

然后,在“父”模块内部

# foo.py
import os 
import moduleA

if __name__ == '__main__':
    print os.path.split(moduleA.print_module_name())[-1]

给出:

>>> 'foo.py'
于 2013-09-22T20:26:43.663 回答