【问题标题】:Can't import python module from a subdirectory with a simple import statement无法使用简单的导入语句从子目录导入 python 模块
【发布时间】:2013-01-28 03:36:39
【问题描述】:

所以我想从一个 python 包中导入一个模块,该包是主脚本所在的子目录。这是目录结构:

maindir \
  - main.py
  - modules \
    - __init__.py
    - module.py

我觉得奇怪的是我不能用简单的import modules.module 导入module.py,因为当我尝试在main.py 中调用函数module.foo() 时,它会返回NameError: name 'module' is not defined。但是,当我执行import modules.module as module 时,一切正常,from modules import module 也是如此。而当module.pymain.py在同一目录下时,一个简单的import module就完全可以调用module.foo()了。

现在的问题是,为什么会这样?为什么一个简单的import 语句不足以从包而不是脚本所在的目录中导入模块?还是我做错了什么?非常感谢您的回答,因为我现在很困惑...

【问题讨论】:

    标签: python


    【解决方案1】:

    它确实导入了模块,只是不能直接访问其名称。当您执行import foo.bar 时,导入的名称为foo,而bar 只能作为其属性访问。如果这是您想要的,您可以使用这种形式的导入;这就是它的用途。如果您不想这样,请使用其他形式的 import 语句。

    如果您希望能够输入module 而不是modules.module,请按照您的发现输入import modules.module as module,或者输入from modules import module

    【讨论】:

    • 后者是首选方法。包含as 关键字的表单主要用于在一行中导入和重命名模块。例如import somemodule as mymodule.
    • 是的,我想它可能是这样的。我猜是因为到目前为止我主要用 Java 编写代码,所以我习惯于在导入某些内容后不必指定完整路径...
    • @Cakejoke:如果您以正确的方式导入它,您不必指定完整路径。有不同形式的导入语句让您选择要引用导入项目的方式。
    • 没错,但同样,来自 Java 环境,我习惯了更简单的导入语法。尽管如此,这可能会使 Python 在处理多个同名模块时更加灵活。
    【解决方案2】:

    当你导入时你仍然需要使用完整的包语法来使用函数 foo。

    以下应该可以工作

    import modules.module
    modules.module.foo() 
    

    更好的方法是

    from modules import module
    module.foo()
    

    第三种不太优雅的方式(但与上面完全相同)是:

    import modules.module as module
    module.foo()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2018-11-25
      相关资源
      最近更新 更多