python no module 路径寻找详解及独立运行脚本 django.core.exceptions.ImproperlyConfigured

1 篇文章 0 订阅
1 篇文章 0 订阅

首先你要确定你的python版本,最好用虚拟环境

运行代码的时候经常会报:no module 

python的模块是这样的,一个文件夹下面有__init__.py 就认为是一个模块,就可以通过from,import导入

__init__.py 是用来初始化模块用的  知道了这个 no module的问题就好解决了。

有个问题,命令行运行python 脚本做测试的时候还是会找不到module!那么解决这个问题?

用代码举个例子: 
目录结构

~/test/django/mysite1$ pwd
/home/itleaks/test/django/
├── db.sqlite3
├── __init__.py
├── __init__.pyc
├── manage.py
├── manage.pyc
├── mysite
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── sample
    ├── admin.py
    ├── admin.pyc
    ├── apps.py
    ├── apps.pyc
    ├── __init__.py
    ├── __init__.pyc
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── 0001_initial.pyc
    │   ├── __init__.py
    │   └── __init__.pyc
    ├── models.py
    ├── models.pyc
    ├── tests.py
    └── views.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

sample/models.py

from __future__ import unicode_literals

from django.db import models

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

sample/tests.py

from sample.models import Question
# Create your tests here.
if __name__ == "__main__":
    Question.objects.all()
    print 'ok'
  • 1
  • 2
  • 3
  • 4
  • 5

上面的Question是一个model, 当该项目以网页运行时,在网页中输入http://127.0.0.1:8000/sample/test是能够正常运行的.但是当我希望在terminal直接执行python sample/tests.py时就会出错.为啥?其实这个问题就是一个运行时环境搭建问题

model运行时环境搭建

用过django的人都知道,当我们要启动它时,肯定都会先执行

python manage.py runserver
  • 1

上面的manage.py就是用来准备django 框架的运行时环境的,所以我们要做的就是 
做一个精简版的manage.py, 然后再执行我们的test.py.哪如何实现一个精简版本的manage.py里。我们先看错误.

No module named local_db.models

~/test/django$ python sample/tests.py 
Traceback (most recent call last):
  File "sample/tests.py", line 1, in <module>
    from sample.models import Question
ImportError: No module named sample.models
  • 1
  • 2
  • 3
  • 4
  • 5

这个库找不到,其实正常来想,这个库确实应该找不到的, 因为sample目录是tests.py的父亲目录,不在它的搜索范围内, 自然找不到。但是我又要问了?为啥以web运行时就可以找到呢?这个就是manage.py的功能,它会把”/home/itleaks/test/django/”添加到模块搜索路径里,这样在web服务器启动test.py时自然能够找到sample.models模块.所以,解决这个问题很简单,在执行这个脚本前也添加这个路径。

export PYTHONPATH=/home/itleaks/test/django
  • 1

然后再执行

python sample/tests.py 
Traceback (most recent call last):
  File "sample/tests.py", line 1, in <module>
    from sample.models import Question
  File "/home/itleaks/test/django/sample/models.py", line 3, in <module>
    from django.db import models
  File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 14, in <module>
    if not settings.DATABASES:
  File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 276, in __getattr__
    self._setup()
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 40, in _setup
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

看到没,第一个问题解决额,现在出现了另外一个问题DJANGO_SETTINGS_MODULE is undefined.

DJANGO_SETTINGS_MODULE is undefined

从这个提示看来,是没有配置setting.想来想去,init.py文件里面最适合添加配置了。由于我们需要访问到根目录下settings.py,因此只能在根目录下的init.py添加。这样同时必须将项目的父亲目录设置为模块路径 
具体代码如下

export PYTHONPATH=/home/itleaks/test/django
  • 1

修改init.py

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'django.mysite.settings'

sys.path.append(os.path.dirname(__file__))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改tests.py

from django.sample.models import Question
# Create your tests here.
if __name__ == "__main__":
    Question.objects.all()
    print 'ok'
  • 1
  • 2
  • 3
  • 4
  • 5

这样在一开始引用django.sample.models的时候,会加载init.py,自然将DJANGO_SETTINGS_MODULE赋值了 
再执行

python local_db/tests.py 
ok
  • 1
  • 2

可见运行成功

模块路径优化

我们前面是通过export PYTHONPATH=/home/itleaks/test/django来将 

我们的项目目录加入库搜索路径的,其实有一种更好的方法,就是在/usr/lib/python2.7/dist-packages/或者/usr/lib/python2.7/site-packages/下增加一个xxx.pth文件,里面的内容就是/home/itleaks/test/django,这样就自动加载了该路径

如果还有疑问可以关注微信公众号jisufenx给我留言,欢迎讨论!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值