【问题标题】:Python: Where does import come from?Python:导入从何而来?
【发布时间】:2019-05-13 13:26:29
【问题描述】:

我在 python 2.7 中遇到了这个奇怪的导入问题

我的应用程序在一个目录中,该目录有一些子目录和更多 python 应用程序同时运行,使用 Pyro 名称服务器相互通信。

当我运行我的一个应用程序时,它在调用其中一个子方法时在导入时崩溃。

这是一个例外:

Traceback (most recent call last):
  File "ps_logic.py", line 15840, in <module>
    ps_logic = PSLogic(pyro_objects, cfg_handler, status_distributor, voip_processing)
  File "ps_logic.py", line 590, in __init__
    self.smarthopper_initial_check()
  File "ps_logic.py", line 12824, in smarthopper_initial_check
    counters_compared = self.smarthopper_maintenance_action()
  File "ps_logic.py", line 12928, in smarthopper_maintenance_action
    status = self.smart_hopper_logic.status_get()
  File "/home/app_core/flexcore/003-480/ps_logic/smart_devices_logic.py", line 203, in status_get
    return SmartStatusAugmented(self.smart_obj.queue_status_get(), self.smart_obj)
  File "/usr/lib/python2.7/site-packages/Pyro/core.py", line 381, in __call__
    return self.__send(self.__name, args, kwargs)
  File "/usr/lib/python2.7/site-packages/Pyro/core.py", line 456, in _invokePYRO
    return self.adapter.remoteInvocation(name, Pyro.constants.RIF_VarargsAndKeywords, vargs, kargs)
  File "/usr/lib/python2.7/site-packages/Pyro/protocol.py", line 497, in remoteInvocation
    return self._remoteInvocation(method, flags, *args)
  File "/usr/lib/python2.7/site-packages/Pyro/protocol.py", line 536, in _remoteInvocation
    answer = pickle.loads(answer)
ImportError: No module named drivers.smart.smart_common_const

它明确表示它无法导入 drivers.smart.smart_common_const 但问题是,我的代码中没有那行。

如果我尝试查找该行在哪个文件中(因为我已经在某些文件中修复了它),它什么也没找到:

app_core@003-481 ~/flexcore/003-480 $ grep -R "from drivers.smart.smart_common_const import" .
./drivers/.svn/pristine/23/23e13acbf9e604f179d4625e18b2b992116a98a1.svn-base:from drivers.smart.smart_common_const import *
./drivers/.svn/pristine/65/65655973d3c70a16cc982db59db8f2989366524b.svn-base:from drivers.smart.smart_common_const import *
./drivers/.svn/pristine/3b/3ba2e2518e64db9188b63247b763926544bddd90.svn-base:from drivers.smart.smart_common_const import *
app_core@003-481 ~/flexcore/003-480 $

但 svn 文件。

我一直在使用-v 选项运行我的python 应用程序,以找出它试图从该文件导入的位置。但是在该异常之前它没有返回任何调试行,所以我猜它是以前导入的东西,或者如果导入失败则什么也不显示。

我还删除了所有*.pyc 文件并重新启动机器以确保内存中没有留下注释,但问题仍然存在。

还有其他方法可以找出问题所在吗?我开始绝望了..

【问题讨论】:

    标签: python-2.7 python-import pyro


    【解决方案1】:

    那个 PS_Logic(不管它是什么)似乎正在使用 Pyro 对服务器进行远程调用。特别是带有以下内容的行,似乎是一个远程调用:

    self.smart_obj.queue_status_get()
    

    服务器发回一个自定义对象,因为它使用 pickle 作为序列化格式,您的客户端程序会尝试重建该对象。显然,您的客户端代码中没有可用的正确模块,因为 pickle 在尝试为您导入所需模块时失败(将响应重新组合成对象)

    该 ps_logic 模块的手册中必须有一些内容告诉您如何正确使用它,并且您可能也应该将它安装在客户端中。

    (顺便建议不要使用pickle,坚持使用Pyro的默认序列化器,那是另外一回事了)

    【讨论】:

    • 感谢您的回复。然而问题是,drivers.smart.smart_common_const 调用既不在客户端也不在服务器部分的代码中。从字面上看,在这些模块中使用的任何代码中都没有。另外,“泡菜”是什么意思?我是外国人,英语是我的第二语言,我从不使用这个词 + 使用谷歌翻译时,它没有给我任何有意义的翻译:)
    • 这是在服务器端使用的导入:import smart_common_const 它没有文件路径。那么蟒蛇从哪里走这条路呢?
    • 第一个问题,什么是“pickle”:pickle是Python提供的一种序列化格式。 Pyro 可以选择使用它,这是您的 ps_logic 模块似乎用来与远程机器对话的库。 pickle 协议将尝试导入它需要的所有必需模块,以反序列化它从某个地方获得的任何内容。因此,您的服务器实际上正在发送一些数据,其中包含在该smart_common_const 库中定义的类型的序列化对象。如果您对此一无所知,那么您应该真正深入了解您的软件、ps_logic 和 Python 的文档。
    • 你的第二个问题,关于导入,是一个基本的 Python 问题,调查 python 导入路径。
    猜你喜欢
    • 2020-01-28
    • 2023-01-07
    • 2021-09-25
    • 1970-01-01
    • 2015-10-07
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多