问题描述
我的文件夹结构:
grpc/
server.py
client.py
...
src/
__init__.py
image_pb2.py
image_pb2_grpc.py
...
server.py
import image_pb2_grpc
import image_pb2
...
image_pb_grpc.py
import image_pb2
...
总而言之,server
依赖于 image_pb2
和 image_pb2_grpc
,而 image_pb2_grpc
也依赖于 image_pb2
。
现在,如果我将 server.py
移动到 src
文件夹中,代码肯定运行良好,因为所有内容都在路径中。
问题是 server.py
应该在 src
文件夹之外。
现在,我仍然可以通过更改 server.py
和 image_pb2_grpc.py
来解决问题:
server.py
from src import image_pb2_grpc
from src import image_pb2
...
image_pb_grpc.py
from src import image_pb2
...
这种方法的问题是,我需要手动更改 image_pb_grpc.py
,因为它们是从 grpc 生成的代码,并且它们是使用 bash 脚本生成的,因此无法手动更改它们。>
如何组织我的项目,以便我可以在 server
之外运行 src
,同时不更改 image_pb2
或 image_pb2_grpc
?
解决方法
我建议将以下代码添加到您的 src/__init__.py
中:
import image_pb2_grpc
import image_pb2
然后您的 server.py
将能够简单地导入这两个文件:
from src import image_pb2_grpc,image_pb2`
我还没有尝试过,但应该可以。
,运行脚本的正确方法是:
$ cd grpc
$ python -m server # this is the one you want to run
使用 server.py 中的相对导入。
如果这不起作用,恐怕您需要破解 sys.path - 但这应该不惜一切代价避免
编辑:
在服务器中导入 image_pb2
就像在 from .src import image_pb2
中一样
sys.modules['image_pb2'] = sys.modules['src.image_pb2']
然后导入 image_pb2_grpc。不要在 __init__.py