Python 3.x 在使用函数获取模块路径时,如何处理异常名称错误?

Python 3.x 在使用函数获取模块路径时,如何处理异常名称错误?,python-3.x,function,exception,Python 3.x,Function,Exception,在获取模块路径的函数中处理它时,会出现NameError异常 def get_path(module): import os try: return os.path.abspath(module.__file__) except NameError: print("Not found ", module) 当我使用get_path(oa)测试模块“oa”是否存在时,我收到了namererror异常(名称“oa”未定义),尽管我在上面的函数

在获取模块路径的函数中处理它时,会出现NameError异常

def get_path(module):
    import os
    try:
        return os.path.abspath(module.__file__)
    except NameError:
        print("Not found ", module)

当我使用
get_path(oa)
测试模块“oa”是否存在时,我收到了
namererror异常
(名称“oa”未定义),尽管我在上面的函数中进行了处理。请解释一下这个案子。谢谢

您无法处理该执行选项,因为如果不先导入模块,您的函数将无法工作,调用函数时会产生名称错误,而函数不在内部:

>>> def get_path(module):
...     import os
...     try:
...         return os.path.abspath(module.__file__)
...     except NameError:
...         print("Not found ", module)
... 
>>> get_path(os)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> import os
>>> get_path(os)
'/usr/lib/python3.6/os.py'

这里有

什么是oa?一个字符串?,因为你的函数需要一个模块对象,我猜它只是用来测试代码的模块的任何名称,比如
get\u path(os)
get\u path(string)
,等等。你是说在引发NameError异常时不会捕获它吗?@OzcarNguyen它与模块对象的名称(string)不同。我不清楚我所看到的问题。你的意思是,我们必须先导入“模块”(例如:os、字符串等),然后才能通过该函数获取其路径。我们怎样才能创建一个函数来检查模块是否已导入?如果是,则返回其路径;如果不是,则处理
namererror
exception@OzcarNguyen,这个处理基础,它在示例中工作。如果您需要调整它以适应您的代码,那么您应该调整它,您不能期望所有问题都会立即得到解决。关键是您应该使用一个字符串作为模块名,检查它是否已经导入,如果它没有导入,请尝试导入ant检查模块路径。如果您有额外的异常,请尝试根据需要处理它们。
def get_path(module_name):
  try:
    if module_name not in globals().keys():
      module = importlib.__import__(module_name, globals())
      globals()[module_name] = module
    module = globals()[module_name]
    return os.path.abspath(module.__file__)
  except ModuleNotFoundError:
    print("Not found module:", module_name)