import 问题

python 中 import 其它模块时,如果路径不对,会出现找不到模块的错误。 假设代码目录结构如下:

-- src
   |-- m1.py
   |-- mod2
   |     `-- m2.py
   |-- mod3
   |     `-- m3.py
   `-- main.py
  • 主程序与模块在同一级目录

    main.py import m1.py

    import m1
    
  • main.py 中 import m2.py

    我们先试试直接 import, 则会报 ImportError: No module named .. 错误。

    >>> import mod2.m2
    ImportError: No module named mod2.m2
    

    这是因为 python 只会把有 __init__.py 文件的目录当做 python package. 在 mod2 目录下添加 __init__.py 文件, 此时目录结构如下:

    -- src
       |-- m1.py
       |-- mod2
       |     |-- __init__.py
       |     `-- m2.py
       |-- mod3
       |     |-- __init__.py
       |     `-- m3.py
       `-- main.py
    

    此时再 import 就不会出错了。

    >>> import mod2.m2
    

    这里我们运行下面的代码看看:

    >>> import mod2
    >>> dir(mod2)
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
    

    我们可以看到这里 dir 函数并没有打印 m2.py, 是不是感觉 比较奇怪,其实这里 import 只是导入了 mod2.__init__.py 如果我们希望 dir(mod2) 能看到 m2.py 里的函数,我们需要在 __init__.py 中 import m2

  • m2 import m3

    这种情况比较复杂, 如果程序的入口是 m2.py , 那么导入方式如下:

    import sys
    sys.append('..')
    import m3
    

    如果程序的入口是 main.py 然后在 main.py 用到了m2, 那么导入方式如下:

    import mod1.m1