V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chuanqirenwu
V2EX  ›  Python

Python 无法 import 位于同级 package 下的代码

  •  
  •   chuanqirenwu · 2017-12-19 00:03:07 +08:00 · 8275 次点击
    这是一个创建于 2561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我正在开发一个简单的 django 应用,目录结构如下:

    django_intuitive_pagination/
        ├── example
        │   ├── config
        │   │   ├── settings.py
        │   ├── items
        │   │   └── views.py
        │   └── manage.py
        ├── intuitive_pagination
        │   ├── __init__.py
        │   ├── mixins.py
        │   └── views.py
    

    我现在将 intuitive_pagination 作为 app 加入到 example/settings.py 的 INSTALLED_APPS 列表中,但是 django 报错说:ImportError: No module named 'intuitive_pagination'

    不加入 INSTALLED_APPS 中,但是我在 items/views 中引入了 intuitive_pagination 包中的代码,如下:

    example/items/views.py
    
    from intuitive_pagination.views import PaginationListView
    

    还是报错说:ImportError: No module named 'intuitive_pagination'

    请问是哪里出了问题?项目的顶层目录已经加入 sys.path 中了:

    >>> sys.path
    [..., '/home/light/Workspace/PycharmProjects/DjangoProjects/django_intuitive_pagination']
    

    似乎是 python 找不到 intuitive_pagination,但不应该呀? intuitive_pagination 不是已经是一个合法的 package 了么?

    第 1 条附言  ·  2017-12-19 21:43:59 +08:00
    补充一下,每个包中都有 __init__.py 文件的,只是为了目录结构简单没有列出来。
    第 2 条附言  ·  2017-12-22 16:32:12 +08:00
    感谢各位,问题已经解决。

    由于 django 的 runserver 没有将项目顶层的路径加入 python path,所以 python 找不到模块。目前的解决办法就是在启动服务器前将其加入 path,pycharm 有内置的服务,很方便。
    15 条回复    2017-12-21 17:45:02 +08:00
    xiangin
        1
    xiangin  
       2017-12-19 00:38:33 +08:00 via Android
    intuitive_pagination 是顶级包么。。
    用相对导入吧
    xiechengen
        2
    xiechengen  
       2017-12-19 02:00:31 +08:00
    每个目录都要加 __init__.py?
    neosfung
        3
    neosfung  
       2017-12-19 08:36:46 +08:00 via iPhone
    django_intuitive_pagination 有__init__.py 么?
    chuanqirenwu
        4
    chuanqirenwu  
    OP
       2017-12-19 09:59:18 +08:00
    @xiangin intuitive_pagination 是项目目录 django_intuitive_pagination 下的一个包
    chuanqirenwu
        5
    chuanqirenwu  
    OP
       2017-12-19 10:00:22 +08:00
    @xiechengen 都有 __init__.py
    @neosfung django_intuitive_pagination 下也加了试过,但还是一样报错
    onemorecd
        6
    onemorecd  
       2017-12-19 10:32:53 +08:00
    是不是用 python django startapp 创建的 app?
    chuanqirenwu
        7
    chuanqirenwu  
    OP
       2017-12-19 10:44:47 +08:00
    @onemorecd items 是的,python manage.py startapp
    vicalloy
        8
    vicalloy  
       2017-12-19 11:09:51 +08:00   ❤️ 1
    config/items
    这两个目录下也需要放 __init__.py
    另外你在 settings.py 里面 print sys.path 看看。
    可能你在 shell 下看到的 sys.path 和项目运行时的不一样。
    billgreen1
        9
    billgreen1  
       2017-12-19 11:22:52 +08:00
    检查你的 working directory
    mec
        10
    mec  
       2017-12-19 14:45:11 +08:00
    你打印的 sys.path 不是运行时的吧
    forrestchang
        11
    forrestchang  
       2017-12-19 17:13:48 +08:00
    每个包下面都加 __init__.py, 然后终端运行 PYTHONPATH=path/to/src python what/you/want/to/run.py
    ccdjh
        12
    ccdjh  
       2017-12-19 17:54:43 +08:00 via iPhone   ❤️ 1
    概念思路梳理一下
    django_intuitive_pagination 文件夹下面,每个文件夹都需要加入__init__.py ,形成包,然后就可以使用 import

    使用 django_intuitive_pagination 的两种情况。
    外部使用,这个不会遇见问题,按照路径就可以了。
    内部使用,通过小圆点 . 来分包的层次,也就是你现在遇见的问题!

    至于 path 包到全局路径,又是另外一个知识点。
    Ehco1996
        13
    Ehco1996  
       2017-12-20 07:40:21 +08:00 via iPhone
    最近我也被导包问题弄的死去活来

    最后我的解决方式是 在文件上面加入当前目录的路径
    zzblack
        14
    zzblack  
       2017-12-20 11:10:11 +08:00   ❤️ 1
    你是直接编译的单独文件还是运行整个项目?从 django_intuitive_pagination 目录下的主程序(如 main.py 或者 run.sh 之类)开始执行,是可以在 example 文件夹里任意.py 直接 import intuitive_pagination 没问题的。应该是单独文件运行和整个项目运行时的环境不同的缘故。
    http://blog.csdn.net/luo123n/article/details/49849649
    这篇博客里有介绍一些,但是他用的 import package.subpackage 的方法我试了不管用,省去 package 直接 import subpackage 是可以的。另外文章下面提到的用__main__来单独运行某个文件,我还没试过,你可以试一下。
    numoone
        15
    numoone  
       2017-12-21 17:45:02 +08:00
    你用的是 py3.6 吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:42 · PVG 02:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.