伪导入程序(模块导入子模块?)

2024-10-03 23:29:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,我真的不知道从哪里开始解决。也许会给别人敲响警钟。在

TLDR:Django应用程序崩溃,重新启动后它会运行,但无法导入某些模块。重新启动后,一切又恢复正常。在

整个故事:

不同Python(2.5.x、2.6.x和2.6.x)和Django版本(分别为1.1.0、1.2.5和1.3.0)上的不同应用程序(我们现在最多有三个)偶尔会出现虚假的importer。例如,其中一个应用程序开始在每个请求中抛出一个ImportError:

from django.contrib.gis.maps.google import GMarker, GEvent

我们收集了strace输出,相关的块在下面(为了简洁和保护有罪者,绝对路径被DIR替换)。在

^{pr2}$

(又是同一件事s/GMarker/GEvent/)

重新启动流程后,一切运行顺利,同时也在运行:

python -c 'from django.contrib.gis.maps.google import GMarker'

不会产生错误。在

GMarker和GEvent类实际上在django.contrib.gis.maps.google.overlays中定义并导入到...maps/google/__init__.py

from django.contrib.gis.maps.google.gmap import GoogleMap, GoogleMapSet
from django.contrib.gis.maps.google.overlays import GEvent, GIcon, GMarker, GPolygon, GPolyline
from django.contrib.gis.maps.google.zoom import GoogleZoom

所以完全可以预料到GMarker.py公司等等。会失败的。Python似乎忘记了__init__.py及其名称空间。在

这些应用程序的流量相对较高,可以想象(虽然不确定)它们可能已经超过了虚拟机的限制,恢复得几乎很优雅。另外,至少在两个案例中,应用程序出现了导致崩溃的早期问题——一个是SIGSEGV,还有一个是err。。。另一个里面有其他东西)。一个应用程序的重启就导致它到处乱扔importer,而另一个程序又让它重新运行起来。损坏的.py[c]?时间戳是古老的。在

所有这些应用程序都运行在从wsgi到fastcgi服务器上。在

到目前为止,每个应用程序都失败过一次(在完全不同的模块中,__init__.py“被遗忘”的两种情况,但我找不到第三个错误ATM),因此我无法判断这些模块是否有意义。在

任何和所有的建议和想法感谢!在


Tags: 模块djangofrompyimport应用程序initgoogle
3条回答

实际上,您的strace行没有任何帮助;这些访问并没有导致模块被导入。在

这种导入错误可能有多种原因:

  1. 有人修改路径系统这已经不在模块路径内了
  2. 这些模块中的循环导入,这是由您先从另一个模块导入触发的!在
  3. 你有站点冲突(是的,有类似的),同一个模块从不同的站点包位置加载
  4. 搜索路径中的某个模块与某个其他模块或某个系统模块冲突。在

如果你把第二组斜线粘贴起来,我们就更接近于解了?在

更新

对于2。我是说,如果你有两个文件的结构如下

在食品/初始化.py:

from bar import baz

在棒.py/初始化.py:

^{pr2}$

在snafu.py公司名称:

import bar
import foo

在好的。好的公司名称:

import foo
import snafu

运行pythonsnafu.py得到一个崩溃和类似的strace输出,运行python好的。好的一切正常。在

strace的输出在我看来很可疑:

DIR/django/contrib/gis/...

我想知道这个DIR部分。您是否可能在某个地方键入了PYTHONPATH变量,而使用了DIR而不是{}?在

我建议你把进口包装起来试试。。。除了ImportError,添加一个代码来执行类似的操作(任何记录而不是打印的代码都可以)

import sys
print sys.modules["django.contrib.gis.maps.google"]
print dir(sys.modules["django.contrib.gis.maps.google"])

这会让你明白发生了什么。在

相关问题 更多 >