如何从 python 包中启动子模块?
How to launch submodules from a python package?
我正在实验室进行机器人项目。 (Github) 大多数主要组件都已完成并记录在案。设置如下:
- 我们运行
opstn
上了基站。它有一个服务器,用于将控制器位置传达给机器人。
- 我们运行
rpi
上了raspberry pi运行宁上机器人。两者通过 wifi 通信并具有静态地址。 raspberry pi 有一个客户端程序,它在有时间时请求控制器位置,决定 运行 电机。
- raspberry pi 通过 USB 与 mbed 通信以允许硬件 PWM。
- raspberry pi 还将与 I2C 设备一起工作以监测数据,并将其传回基站进行处理。这最终将运行作为一个单独的服务器进程,基站将有一个客户端进程与之通信。
- 基站可能需要一个客户端模块来解释设备数据,运行宁作为一个单独的进程。
代码确实有效,但我们必须 运行 以一种有点冗长的方式:
- 在基站上,
cd
变成kaginawa
和python -m opstn
,运行宁opstn/__main__.py
- SSH进入raspberry pi,
cd
进入kaginawa
和python -m rpi
,运行宁rpi/__main__.py
我想知道如何正确启动子模块。对于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 来捆绑您的代码。
我正在实验室进行机器人项目。 (Github) 大多数主要组件都已完成并记录在案。设置如下:
- 我们运行
opstn
上了基站。它有一个服务器,用于将控制器位置传达给机器人。 - 我们运行
rpi
上了raspberry pi运行宁上机器人。两者通过 wifi 通信并具有静态地址。 raspberry pi 有一个客户端程序,它在有时间时请求控制器位置,决定 运行 电机。 - raspberry pi 通过 USB 与 mbed 通信以允许硬件 PWM。
- raspberry pi 还将与 I2C 设备一起工作以监测数据,并将其传回基站进行处理。这最终将运行作为一个单独的服务器进程,基站将有一个客户端进程与之通信。
- 基站可能需要一个客户端模块来解释设备数据,运行宁作为一个单独的进程。
代码确实有效,但我们必须 运行 以一种有点冗长的方式:
- 在基站上,
cd
变成kaginawa
和python -m opstn
,运行宁opstn/__main__.py
- SSH进入raspberry pi,
cd
进入kaginawa
和python -m rpi
,运行宁rpi/__main__.py
我想知道如何正确启动子模块。对于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 来捆绑您的代码。