如何从 python 包中启动子模块?

How to launch submodules from a python package?

我正在实验室进行机器人项目。 (Github) 大多数主要组件都已完成并记录在案。设置如下:

代码确实有效,但我们必须 运行 以一种有点冗长的方式:

我想知道如何正确启动子模块。对于rpi/__main__.py,我想在__main__.py中提供两个功能(电机控制客户端和设备服务器),并使用multiprocessing到运行。实验似乎表明这会起作用。

不过,我想做的是将我的目录压缩到一个可执行文件中,然后简单地 ./start_robot。这就是 Makefile 所做的,并且效果很好。但是,无论我尝试什么,我似乎都无法启动 opstn。而且我还需要使用 SSH,因为我需要使用 sudo 启动 rpi。我可能可以用 paramiko 使用 this reply.

如果可能,我正在考虑使用 os.uname()[1] 检查它是否在 raspberry pi 上并启动 rpi,否则 opstn

tl;dr 如何从 python 包的根 __main__.py 启动包含 __main__.py 的子模块?

项目中的顶层目录不应是Python包。它可能是带有 setup.py 的目录。

你不应该 cd 在 Python 包里。将你的 zip 放在 PYTHONPATH 中的某处(通过 print(sys.path) 检查)并对 运行 子模块使用绝对名称,例如 运行:

$ python -m kaginawa.opstn

到 运行 kaginawa/opstn/__main__.py 脚本或 运行:

$ python -m kaginawa.rpi

到运行kaginawa/rpi/__main__.py.

如果您想在 运行 时选择要 运行 的内容,那么您可以在 kaginawa/__main__.py 中调用 kaginawa.opstn.main()kaginawa.rpi.main() 函数。 运行 它:

$ python -mkaginawa

你可以run the zip directly.

为了简化包含依赖项,您可以使用 PyInstaller,cx_Freeze 来捆绑您的代码。