Django / Python无法从脚本导入模块,但可以从IDE

时间:2015-12-06 22:13:28

标签: python django

我正在通过芹菜任务运行脚本,由于某种原因我无法导入我的某个应用模型。如果我尝试从IDE导入模型,则导入OK。

我正在设置我的环境:

#! /tools/envs/networktools/networktools/bin/ipython
import os
import sys
sys.path.append('/tools/envs/networktools/nettools/')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nettools.settings')
from django.conf import settings
from django.core.mail import EmailMessage

from siteinfo.models import SiteCode, Subnets
from pingsweep.models import RunTime, HostStatus << this causes the following error

通过脚本

运行时出错
(networktools) NetworkTools> tail logs/celery-worker.log
ImportError                               Traceback (most recent call last)
/tools/envs/networktools/nettools/scripts/python/pingsweep/pingsweep_db.py in <module>()
      8
      9 from siteinfo.models import SiteCode, Subnets
---> 10 from pingsweep.models import RunTime, HostStatus
     11
     12 from operator import itemgetter

ImportError: No module named 'pingsweep.models'; 'pingsweep' is not a package

如果我通过IDE运行,我可以导入包

In [1]: #! /tools/envs/networktools/networktools/bin/ipython

In [2]: import os

In [3]: import sys

In [4]: sys.path.append('/tools/envs/networktools/nettools/')

In [5]: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nettools.settings')
Out[5]: 'nettools.settings'

In [6]: from django.conf import settings

In [7]: from django.core.mail import EmailMessage

In [8]: from siteinfo.models import SiteCode, Subnets

In [9]: from pingsweep.models import RunTime, HostStatus

In [10]:

经过一番搜索我的怀疑是一个名称空间问题,但我找不到冲突。任何人的想法?

1 个答案:

答案 0 :(得分:0)

好吧,看起来你的模块安排得很奇怪,所以你需要在sys.paths中添加更多的路径。

sys.path.append('/tools/envs/networktools/nettools/scripts/python/')

这一切都取决于您从哪个目录启动解释器。我假设您正在从我正在添加到上面的sys.path的python目录中打开IDE中的解释器,这会将pingsweep模块直接放在您的路径上。

您的脚本从nettools目录开始。如果您想从那里访问pingsweep,则需要说:

from scripts.python.pingsweep import .. # dont do this

但您还需要确保__init__.pyscripts目录中有python个文件。那可能不是你想做什么。