Django中的global / app lib文件夹导入

时间:2012-05-05 12:09:08

标签: python django

我有一个像这样的Django结构(只显示libs):

project/lib/ # Global libraries that will be used cross apps
project/lib/global_stuff.py
project/apps/app1/lib/special_for_app1.py
project/apps/app2/lib/special_for_app2.py

某些应用没有lib文件夹。

from apps.app1.lib import special_for_app1运行正常。但是当我在已经包含本地lib文件夹的文件夹中时,如何从全局lib文件夹导入?

在其中一个应用上的apps views.py文件中:


from lib import global_stuff

给我ImportError: cannot import name global_stuff


来自.lib import global_stuff

给我ImportError: cannot import name global_stuff


from ..lib import global_stuff

给我ImportError: No module named lib


from ...lib import global_stuff

给我ValueError: Attempted relative import beyond toplevel package


from project.lib import global_stuff

工作,但我真的不想在导入中使用项目名称本身。


有没有办法解决这个问题,不是在导入中使用项目名称,也不是改变整个lib的想法。

或者有没有其他良好的做法来存储代码的主要部分?

2 个答案:

答案 0 :(得分:4)

您不希望将项目名称与导入相关联,因此有一个共同的模式:

project/
  |__/source/
  |     |__/lib/
  |     |__/app/
  |__/deployment/  # code for your production deployment maybe
  |
  |__/docs/   
  |__/tests/
  |__README
  |__requirements.txt

并将/ path / to / project放在virtualenv的路径中(你使用virtualenv吧?)。

然后你可以在你的代码里面做

from source.lib.blah import foo
from source.app.baz import bar

编辑:如果您不将代码作为开源发布,这只是最佳选择。只有当您有一个内部项目,管理层不断更改项目名称时:D

答案 1 :(得分:3)

  

我真的不想在导入

中使用项目名称本身

为什么不呢?这是最好的方式。请注意,“非常不鼓励进行包裹内进口的相对进口”, - said in PEP-8