作者:sky梦幻 | 来源:互联网 | 2023-07-13 15:31
我有以下项目结构:serverserver.py__init__.pysocketsmodule.py__init__.py我将PYTHONPATH设置为服务器上方的一个目录(例如
我有以下项目结构:
server/
server.py
__init__.py
sockets/
module.py
__init__.py
我将PYTHONPATH设置为服务器上方的一个目录(例如/ home / user / server包含服务器,PYTHONPATH设置为/ home / user).
主文件是server.py;它导入模块:
import sockets
from sockets.module import Module
当我直接运行python3 $PYTHONPATH / server / server.py时,它运行得很好.
但是,当我调用python3 -m server.server.py它失败时,尽管明确建议它避免使用Python路径地狱,但它找不到该模块,并带有一条丑陋的消息:
/usr/bin/python3: Error while finding spec for 'server.server.py' (: No module named 'sockets')
为什么模块导入无法导入子模块?
如何正确设置子包?
解决方法:
这种行为是完全正确的;套接字不是顶级模块.但是,当您使用$PYTHONPATH / server / server.py时,Python还会将$PYTHONPATH / server /添加到Python搜索路径,因此现在套接字是顶级模块.您永远不应该直接在包中运行文件.
导入相对于当前包的套接字:
from . import sockets
from .sockets.module import Module
或使用完全合格的进口:
from server import sockets
from server.sockets.module import Module
另请参阅精细手册中的“Python设置和使用”部分的Interface Options section:
If the script name refers directly to a Python file, the directory containing that file is added to the start of sys.path
, and the file is executed as the __main__
module.
请注意,-m开关采用python标识符,而不是文件名,因此请使用:
python -m server.server
离开.py扩展名.