【问题标题】:Is it possible to import a module using a string in python? [duplicate]是否可以在 python 中使用字符串导入模块? [复制]
【发布时间】:2021-05-04 15:53:14
【问题描述】:

有没有机会使用下面给出的sn-ps?当我运行此代码时,它返回“未安装模块熊猫”

a = "pandas"

try:
    import a
    print("module ",a," is installed")
except ModuleNotFoundError:
    print("module ",a," is not installed")

但是当我运行下面给出的代码时:

try:
    import pandas
    print("module pandas is installed")
except ModuleNotFoundError:
    print("module pandas is not installed")

它返回“模块 pandas 已安装”。

它们有什么区别?

【问题讨论】:

  • 你可能想要eval("import %s" % a) 在第一个sn-p 中。
  • 不试就试一下,你就会明白其中的区别。 a = "熊猫" 导入 a 。错误将是“ModuleNotFoundError: No module named 'a'”
  • 你的标题和你的身体不是同一个问题。请修复。

标签: python try-except


【解决方案1】:

在第一个示例中,您所做的更等同于以下内容:

try:
    import "pandas"
    print("module ",a," is installed")
except ModuleNotFoundError:
    print("module ",a," is not installed")

您不能导入字符串,除非您使用importlib。您可以找到该库 here 的文档。如下所示:

import importlib

a = "pandas"

try:
    globals()[a] = importlib.import_module(a)
    print("module ",a," is installed")
except:
    print("module ",a," is not installed")

【讨论】:

  • __import__(a, globals(), locals(), [])) 也可以。
【解决方案2】:

您必须使用exec() 将脚本作为一个组合格式的字符串执行,这实际上会执行脚本:

a = "pandas"

try:
    exec(f'import {a}')
    print("module ",a," is installed")
except ModuleNotFoundError:
    print("module ",a," is not installed")

要了解更多关于 Python exec() 函数的信息,请访问:

https://www.w3schools.com/python/ref_func_exec.asp

【讨论】:

    【解决方案3】:

    在您的第一个示例中,您导入了一个名为 a 的模块(您不能在 import 语句中使用变量),这将导致 ModuleNotFoundError。在第二个示例中,您导入了一个名为 pandas 的模块。

    如果您想动态导入模块(例如基于用户输入),请使用importlib

    import importlib
    
    name = 'pandas'
    try:
        module = importlib.import_module(name)
        print(f'Module {name} is installed')
    except ModuleNotFoundError:
        print(f'Module {name} is not installed')
    

    不要使用evalexec - 它们不安全。

    【讨论】:

      【解决方案4】:

      @Jaz 已成功显示您的第一种方法有什么问题。您不能使用 import 语句按变量名导入模块。

      一般来说,python 的哲学是请求宽恕,而不是许可。所以你经常会在有可选依赖的普通模块中看到如下构造:

      try:
          import pandas
      except ImportError:
          print("pandas is not installed")
      else:
          print("pandas is installed")
      

      import 语句的编程接口是内置的__import__ 函数。你可以像这样使用它:

      m = 'pandas'
      try:
          locals()[m] = __import__(m)
      except ImportError:
          ...
      

      importlib的功能提供了一个简化的界面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-17
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 2018-05-02
        • 1970-01-01
        相关资源
        最近更新 更多