【问题标题】:Django/Python cannot import module from script, but can import from IDEDjango/Python 无法从脚本导入模块,但可以从 IDE 导入
【发布时间】:2015-12-06 22:13:28
【问题描述】:

我正在通过 celery 任务运行脚本,但由于某种原因,我无法导入其中一个应用模型。如果我尝试从 IDE 导入模型,则导入正常。

我正在这样设置我的环境:

#! /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]:

经过一番搜索,我怀疑是名称空间问题,但我找不到冲突。有什么想法吗?

【问题讨论】:

  • 您的pingsweep 目录中有__init__.py 文件吗?此外,如果您使用的是 Django 1.8(可能还有 1.7),则需要调用 django.setup() 才能正确加载所有内容。
  • 我有一个 init.py,我试试 django.setup() 看看效果如何,同样使用 Django 1.8
  • @JoshSmeaton 不幸的是没有骰子,同样的错误。仅供参考,以前不必使用 django.setup() 并且我有许多使用相同设置运行的脚本

标签: python django


【解决方案1】:

好的,看来您的模块排列方式很奇怪,因此您需要在 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

但您还需要确保在scriptspython 目录中有一个__init__.py 文件。不过,这可能不是你想要做的。

【讨论】:

  • 感谢乔希的回复。此模块from siteinfo.models import SiteCode, Subnetsfrom pingsweep.models import RunTime, HostStatus 处于同一结构级别。我会尝试改变路径,看看效果如何
  • 看起来确实是命名空间问题。该脚本位于名为pingsweep 的文件夹中,还有另一个名为pingsweep.py 的脚本。呃。感谢@Josh Smeaton 的帮助
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多