python3使用模块内部的内部依赖解析相对导入

问题描述

我的文件夹结构:

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_pb2image_pb2_grpc,而 image_pb2_grpc 也依赖于 image_pb2

现在,如果我将 server.py 移动到 src 文件夹中,代码肯定运行良好,因为所有内容都在路径中。

问题是 server.py 应该在 src 文件夹之外。

现在,我仍然可以通过更改 server.pyimage_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_pb2image_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

中添加任何导入