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

2017-12-19 00:03:07 +08:00
 chuanqirenwu

我正在开发一个简单的 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 了么?

8046 次点击
所在节点    Python
15 条回复
xiangin
2017-12-19 00:38:33 +08:00
intuitive_pagination 是顶级包么。。
用相对导入吧
xiechengen
2017-12-19 02:00:31 +08:00
每个目录都要加 __init__.py?
neosfung
2017-12-19 08:36:46 +08:00
django_intuitive_pagination 有__init__.py 么?
chuanqirenwu
2017-12-19 09:59:18 +08:00
@xiangin intuitive_pagination 是项目目录 django_intuitive_pagination 下的一个包
chuanqirenwu
2017-12-19 10:00:22 +08:00
@xiechengen 都有 __init__.py
@neosfung django_intuitive_pagination 下也加了试过,但还是一样报错
onemorecd
2017-12-19 10:32:53 +08:00
是不是用 python django startapp 创建的 app?
chuanqirenwu
2017-12-19 10:44:47 +08:00
@onemorecd items 是的,python manage.py startapp
vicalloy
2017-12-19 11:09:51 +08:00
config/items
这两个目录下也需要放 __init__.py
另外你在 settings.py 里面 print sys.path 看看。
可能你在 shell 下看到的 sys.path 和项目运行时的不一样。
billgreen1
2017-12-19 11:22:52 +08:00
检查你的 working directory
mec
2017-12-19 14:45:11 +08:00
你打印的 sys.path 不是运行时的吧
forrestchang
2017-12-19 17:13:48 +08:00
每个包下面都加 __init__.py, 然后终端运行 PYTHONPATH=path/to/src python what/you/want/to/run.py
ccdjh
2017-12-19 17:54:43 +08:00
概念思路梳理一下
django_intuitive_pagination 文件夹下面,每个文件夹都需要加入__init__.py ,形成包,然后就可以使用 import

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

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

最后我的解决方式是 在文件上面加入当前目录的路径
zzblack
2017-12-20 11:10:11 +08:00
你是直接编译的单独文件还是运行整个项目?从 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
2017-12-21 17:45:02 +08:00
你用的是 py3.6 吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/415836

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX