Spurious ImportErrors(模块导入子模块?)

Grz*_*sek 10 python django import importerror

我有一个问题,我真的不知道从哪里开始解决.也许它会敲响某人的钟声.

TLDR: Django应用程序崩溃,重启后运行但无法导入某些模块.再次重启时,一切都很好.

整个故事:

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

from django.contrib.gis.maps.google import GMarker, GEvent
Run Code Online (Sandbox Code Playgroud)

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

stat64("DIR/django/contrib/gis/maps/google/GMarker", 0xf699ce3c) = -1 ENOENT (No such file or directory)
open("DIR/django/contrib/gis/maps/google/GMarker.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("DIR/django/contrib/gis/maps/google/GMarkermodule.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("DIR/django/contrib/gis/maps/google/GMarker.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("DIR/django/contrib/gis/maps/google/GMarker.pyc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

(再一次是同样的事情s/GMarker/GEvent /)

重启过程后,一切运行顺利,同时运行:

python -c 'from django.contrib.gis.maps.google import GMarker'
Run Code Online (Sandbox Code Playgroud)

不产生任何错误.

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
Run Code Online (Sandbox Code Playgroud)

因此完全可以预期装载GMarker.py等.将失败.似乎Python已经忘记了__init__.py它的命名空间.

这些应用程序的流量相对较高,可以想象(虽然不确定)它们可能超出了VM的限制,并且几乎可以优雅地恢复.此外,至少在两种情况下,应用程序早先出现导致崩溃的问题 - 一种情况下出现SIGSEGV,另一种出现错误......其他情况.单个应用程序重新启动导致它抛出ImportErrors,另一个使它再次运行.瑕疵.py [c]?时间戳很古老.

所有这些应用程序都在wsgi-to-fastcgi服务器上运行.

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

任何和所有指针和想法赞赏!

Ale*_*nik 0

strace 输出对我来说似乎很可疑:

DIR/django/contrib/gis/...
Run Code Online (Sandbox Code Playgroud)

我对这DIR部分感到好奇。您是否可能在某处错误输入了 PYTHONPATH 变量,而使用DIR$DIR