循环依赖导致未导入?

时间:2019-08-19 17:49:53

标签: python pip protocol-buffers python-import circular-dependency

代码为here

我已经创建了一个文件results_pb2.py。然后,我utils.py导入了该文件。

但是,当我尝试运行utils_test.py时,我得到了循环依赖。由于某种原因,results_pb2.py正在调用另一个Python程序tcav.py,该程序通过一系列依赖项依赖于utils.py。这是下面的完整链/堆栈跟踪:

File "/usr/local/home/karanshukla/tcav/tcav/utils_test.py", line 19, in <module>
  from tcav.utils import flatten, process_what_to_run_expand, process_what_to_run_concepts, process_what_to_run_randoms
File "tcav/utils.py", line 20, in <module>
  from tcav.results_pb2 import Result, Results
File "tcav/tcav.py", line 22, in <module>
  from tcav.cav import CAV
File "tcav/cav.py", line 27, in <module>
  from tcav import utils
ImportError: cannot import name utils

奇怪的是,我看不到results_pb2.py 导入了tcav.py。如果有人可以解释是什么原因导致这种意外的导入,我将不胜感激。

作为参考,以下是results_pb2.py中的导入:

import sys
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database

要重现该错误,请安装protoc工具(用于生成results_pb2.py),从here提取代码库,然后运行以下命令:

pip uninstall tcav
rm tcav/results_pb2.pyc tcav/results_pb2.py
protoc tcav/results.proto --python_out=.
python setup.py bdist_wheel --python-tag py2
pip install dist/tcav-0.2.1-py2-none-any.whl
python -m tcav.utils_test

1 个答案:

答案 0 :(得分:0)

这很可能是由于将整个protoc模块作为依赖项的tcav序列化引起的。将results.prototcav模块外部移到新的单独的tcav_results模块中解决了该问题。

这似乎并不理想。但是,它解决了因使用protoc进行序列化而导致的循环依赖的问题。