Python: откуда приходит импорт? - PullRequest
0 голосов
/ 13 мая 2019

У меня была странная проблема с импортом в python 2.7

У меня есть приложение в каталоге, в котором есть несколько подкаталогов и несколько приложений python, работающих одновременно, используя Pyro Name Server для связи друг с другом.

Когда я запускаю одно из моих приложений, оно падает при импорте при вызове одного из вспомогательных методов.

Вот исключение:

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 файлы.

Я запускаю свое приложение на python с опцией -v, чтобы выяснить, куда оно пытается импортировать из этого файла. НО она не возвращает nay строку отладки до этого исключения, поэтому я предполагаю, что это что-то импортированное ранее или ничего не показывает, если импорт не удался.

Я также удалил все файлы *.pyc и перезагрузил компьютер, чтобы убедиться, что в памяти не осталось отметок, но проблема осталась.

Есть ли другой вариант, как узнать, в чем проблема? Я начинаю отчаяться ..

1 Ответ

0 голосов
/ 14 мая 2019

То, что PS_Logic (что бы это ни было), похоже, использует Pyro для удаленных вызовов на сервер.В частности, строка со следующим, похоже, является удаленным вызовом:

self.smart_obj.queue_status_get()

Сервер отправляет обратно пользовательский объект и, поскольку он использует pickle в качестве формата сериализации, ваша клиентская программа пытается восстановить этот объект.Очевидно, у вас нет правильных модулей, доступных в вашем клиентском коде, потому что это pickle , который завершается неудачно, когда он пытается импортировать требуемый модуль для вас (чтобы собрать ответ в объекты)

В руководстве этого модуля ps_logic должно быть что-то, что говорит вам о том, как правильно его использовать, и, возможно, вы должны установить его на клиенте.

(Рекомендуется не использоватькстати, и придерживайтесь стандартного сериализатора Pyro, но это уже другая история)

...