草庐IT

python - 虚假导入错误(模块导入子模块?)

coder 2023-08-18 原文

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

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

我们收集了 strace 输出,相关 block 如下(为简洁起见,用 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)

(同样的东西 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 及其命名空间。

这些应用程序的流量相对较高,可以想象(尽管不确定)它们可能已经超出了 VM 限制并几乎正常恢复。此外,至少在两种情况下,该应用程序存在导致崩溃的早期问题——一种情况是 SIGSEGV,另一种情况是 err... 其他问题)。单个应用程序重启导致它抛出 ImportErrors,而另一个应用程序使其再次运行。损坏的 .py[c]?时间戳是古老的。

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

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

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

最佳答案

实际上,您的 strace 行没有一点帮助;这些访问不会导致模块被导入。

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

  1. 有人修改了 sys.path 并且它不再在模块路径中
  2. 这些模块中的循环导入,由您首先从另一个模块导入触发!
  3. 您有站点冲突(是的,有那种),从不同的站点包位置加载相同的模块
  4. 您在搜索路径中有一个模块与某处的其他模块或系统模块发生冲突。

如果您粘贴第二组 strace 行,我们会更接近解决方案吗?

更新

对于 2. 我的意思是如果你有 2 个具有以下结构的文件

foo.py/init.py:

from bar import baz

bar.py/init.py:

import foo
def baz():
     pass

snafu.py:

import bar
import foo

确定.py:

import foo
import snafu

运行 python snafu.py,你会得到一个崩溃和类似的 strace 输出,运行 python ok.py,一切正常。

关于python - 虚假导入错误(模块导入子模块?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7260964/

有关python - 虚假导入错误(模块导入子模块?)的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  9. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  10. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

随机推荐