Python 无法 import 位于同级 package 下的代码 - V2EX
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 8878 次点击
    这是一个创建于 2938 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我正在开发一个简单的 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     Solana     3643 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 05:08 PVG 13:08 LAX 21:08 JFK 00:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86