代码为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
答案 0 :(得分:0)
这很可能是由于将整个protoc
模块作为依赖项的tcav
序列化引起的。将results.proto
从tcav
模块外部移到新的单独的tcav_results
模块中解决了该问题。
这似乎并不理想。但是,它解决了因使用protoc
进行序列化而导致的循环依赖的问题。