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

python导入错误

  •  4
  • Aun  · 技术社区  · 16 年前

    我的进口货怎么了?

    应用程序文件夹结构:

    我的应用程序/

    • 模型/型号.py包含 SpotModel()
    • 测试/测试.py包含TestSpotModel(unittest.TestCase测试用例). 测试.py进口 from myapp.models.models import *
    • 脚本/导入.py包含 从myapp.models.models模型导入*

    问题是导入.py执行时会导致错误:

    ImportError: No module named myapp.models.models
    

    但是测试.py跑。

    我有 __init__.py myapp/__init__.py , myapp/models/__init__.py myapp/tests/__init__.py 如前所述,使用nosetests运行单元测试可以按预期工作。

    4 回复  |  直到 13 年前
        1
  •  4
  •   Ihor Kaharlichenko    16 年前

    它是 __init__.py init.py . 确保层次结构中的每个目录都包含它,以便能够导入。

    我设法复制了它。 目录结构如下:

    cesar@cesar-laptop:/tmp/asdasd$ tree
    .
    `-- myapp
        |-- __init__.py
        |-- models
        |   |-- __init__.py
        |   `-- models.py
        |-- scripts
        |   |-- data.py
        |   `-- __init__.py
        `-- tests
            |-- __init__.py
            `-- tests.py
    

    data.py 要缩小问题范围:

    import sys
    import pprint
    
    pprint.pprint(sys.path)
    
    from myapp.models.models import *
    

    运行 数据.py

    cesar@cesar-laptop:/tmp/asdasd$ python myapp/scripts/data.py
    ['/tmp/asdasd/myapp/scripts',
     '/usr/lib/python2.6',
     '/usr/lib/python2.6/plat-linux2',
     '/usr/lib/python2.6/lib-tk',
     -- Skipped --
    '/usr/local/lib/python2.6/dist-packages']
    Traceback (most recent call last):
      File "myapp/scripts/data.py", line 6, in 
        from myapp.models.models import *
    ImportError: No module named myapp.models.models
    

    但这种方式很有魅力:

    cesar@cesar-laptop:/tmp/asdasd$ python -m myapp.scripts.data
    ['',
     '/usr/lib/python2.6',
     '/usr/lib/python2.6/plat-linux2',
     '/usr/lib/python2.6/lib-tk',
     -- Skipped --
    '/usr/local/lib/python2.6/dist-packages']
    

    注意第一个条目中的差异 sys.path .

        2
  •  1
  •   bobince    16 年前

    你执行得怎么样 import.py

    这个 myapp 目录必须在Python上 (即在 sys.path )为了你能 import 是的。Python会在解释器启动时自动将当前工作目录添加到路径列表中。

    如果包含 我的应用程序 PYTHONPATH 环境变量,或将其添加到 搜索路径 sitecustomize.py ),则需要位于包含 当你运行脚本的时候。如果你在里面 目录本身,您将无法导入 我的应用程序

        3
  •  1
  •   Alex Martelli    16 年前

    你的 sys.path 显然,在运行测试和脚本时设置的方式不同。做

    import sys
    print(sys.path)
    

    在两个模块的顶部确认。然后,修复一个错误(通过附加到 搜索路径 的父目录 myapp 如果它不见了。

        4
  •  0
  •   Alan Plum    16 年前

    除非你忘了提,否则你就没有机会了 __init__.py myapp/scripts ,所以 myapp/scripts/import.py 不是的模块 myapp

    除非 我的应用程序 在您的全局路径中,脚本找不到它,因为它不会在正确的位置找到它。

    __初始值 为此,将脚本向上移动到文件系统层次结构(或者 我的应用程序 或安装 我的应用程序 进入你的路径(即移动到你的 packages /usr/lib/python2.6/dist-packages/ ).