代码之家  ›  专栏  ›  技术社区  ›  khelll

在嵌套包中导入模块

  •  17
  • khelll  · 技术社区  · 15 年前

    这是一个关于python新手的问题:

    我有以下目录结构:

    test
     -- test_file.py
    a
     -- b
       -- module.py    
    

    在哪里? test , a b 是文件夹。两者都是 测试 在同一水平上。

    module.py有一个名为 shape ,我想在test_file.py中实例化它的一个实例。我该怎么做?

    我已经尝试过:

    from a.b import module
    

    但我得到了:

    ImportError: No module named a.b
    
    3 回复  |  直到 15 年前
        1
  •  16
  •   3lectrologos    15 年前

    你想要的是相对导入,比如:

    from ..a.b import module

    问题在于,如果您将test_file.py作为主模块调用,那么它将不起作用。如上所述 here :

    请注意,显式和隐式相对导入都基于当前模块的名称。因为主模块的名称始终是“ 主要的 “,用作Python应用程序主模块的模块应始终使用绝对导入。

    所以,如果你想打电话 test_file.py 作为主模块,您应该考虑更改模块的结构并使用绝对导入,否则只使用上面的相对导入。

        2
  •  13
  •   S.Lott    15 年前
    1. 目录 a 需要打包。添加一个 __init__.py 文件使其成为一个包,这是从简单目录开始的一个步骤。

    2. 目录 b 还需要是 . 添加一个 π介子 文件。

    3. 目录 test 可能也是一个包裹。很难说这是否必要。对于每个Python模块目录来说,将其作为一个正式的包通常是一个好主意。

    4. 为了 import ,包裹需要打开 sys.path ;这是根据 PYTHONPATH 环境变量。默认情况下,安装的站点包和当前工作目录是(有效地)唯一可以找到包的两个位置。

      那意味着 必须安装,或者当前工作目录也必须是一个一级以上的包 .

      或者,您需要设置 Python路径 要包含的环境变量 .

    http://docs.python.org/tutorial/modules.html#the-module-search-path

    http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

    也, http://docs.python.org/library/site.html 有关如何 搜索路径 是建立起来的。

        3
  •  8
  •   Noufal Ibrahim    15 年前

    首先要做的是快速浏览 the official docs on this .

    要使目录成为包,必须添加 __init__.py 文件。这意味着您将在 a b 目录。然后你可以直接做一个

    import a.b.module
    

    但你必须把它称为 a.b.module 这很乏味,所以你可以使用 as 像这样的进口形式

    import a.b.module as mod #shorter name
    

    并称之为 mod .

    然后你可以实例化里面的东西 国防部 使用常规惯例,如 mod.shape() .

    还有其他一些微妙之处。请看一下文件了解详情。