我正在构建一个在python上运行的四轴飞行器。
script1
是一个让我控制4台电机速度的过程。
script2
应该是一个调节电机的过程,以使我的四轴飞行器保持稳定。
我在motorspeed
中有一个变量script1.py
,我想将其导入script2.py
。我试过了
from script1.py import motorspeed
,
然而,这只会启动script1.py
并且不会执行script2
。由于script1.py
是一个while循环,script2.py
永远不会被执行。当我按下一个按钮(关闭四轴飞行器)时,while循环结束,所以我需要在script2.py
运行时运行script1.py
。如何在motorspeed
中获取变量script2.py
以增加和降低电机的速度?
答案 0 :(得分:2)
基本上,您想要将电机速度从正在运行的script1.py
发送到正在运行的script2.py
,对吗?
注意:从文件导入内容不将该文件作为单独的进程运行!
要使正在运行的程序交换数据,您必须
启动两个脚本至少有三种方法可以同时运行。
A)从命令行;
python script1.py &
python script2.py &
B)subproces
。在script1.py
做;
import subprocess as sp
sp.Popen(['python', 'script2.py'])
C)multiprocessing
import multiprocessing as mp
import script2
p = mp.Process(target=script2.main) # Assuming script2 has a main function.
p.start()
如何做IPC取决于你如何启动脚本。
在所有三种情况下,您都可以使用sockets作为沟通方式。您必须在所选端口号(例如12345)上将script2
设置为服务器。如果script1
想要增加或减少电机速度,它将连接到端口12345并发送包含新电机速度的消息。除了链接的howto之外,还有许多套接字教程,详细的答案在这里太长了。
如果您选择使用multiprocessing
(选项C),则可以使用共享内存value
。
# script1
import multiprocessing as mp
import script2
motorspeed = mp.Value('d', 0.0)
p = mp.Process(target=script2.main, args=(motorspeed,))
p.start()
当然script2.main
应该认出一个论点!
这两个进程现在可以操作motorspeed
对象。
如果不希望script2
也可以更改motorspeed
,您可以设置Pipe
。
# script1
import multiprocessing as mp
import script2
parent_conn, child_conn = mp.Pipe(duplex=False)
p = mp.Process(target=script2.main, args=(child_conn,))
p.start()
motorspeed = 23.6
parent_conn.send(motorspeed)
在这种情况下,script2.main
应定期阅读消息!
总而言之,我建议采用multiprocessing
路线,因为它有最简单的方式来建立通信。
答案 1 :(得分:0)
您可以尝试
from script1 import motorspeed
根据您的描述,您只想实时更改速度。所以基本上你不应该在你的script1
中添加一个while循环。 script1
应该只关注控制点(与机器连接)。然后在你的script2
(主要是你的情况下)中,你应该放置while
循环。
答案 2 :(得分:0)
您不需要多个流程。您只需要寻找一些基本的并发(即同时执行多项操作而不会阻塞另一项),您可以使用线程。
script1.py
:
from threading import Thread
motorspeed = 0
def control_speed():
# I'm doing this to stick to your question, but prefer using a class
global motorspeed
while True:
motorspeed += 0.01
# This runs control_speed 'in the background'
Thread(target=control_speed).start()
script2.py
:
from time import sleep
# from script1 import motorspeed will not work
import script1
while True:
sleep(1)
print(script1.motorspeed)
运行script2.py
输出几秒钟:
91131.589991
191556.080026
283986.210112
384517.350206
答案 3 :(得分:0)
除非您同时运行两个脚本,否则在一个脚本中导入变量可能会获得您实际预期的值。您必须启动这两个脚本并管理一些进程间通信才能传递变量。
或者您可以使用ZeroMQ或RabbitMQ之类的Message Queue来实现这一目标。
这段代码架构感觉不对。您不会将变量从一个python脚本导入另一个。相反,您可以将motor的speed_control功能作为函数放在一个脚本中作为函数,然后将该函数导入到第二个函数中。
根据功能拆分模块并将其放入功能中。 然后在你执行的主python文件中,你可以在需要时调用函数speed_control()。
我不是四轴飞行器的专家,但是让我建议以下python代码架构。
假设您将motor_speed_control函数放在名为msc.py的模块中,并将传感器数据放在sense.py中。
现在在steady.py中,您可以在while循环中继续检查传感器数据,例如偏航或俯仰,如果条件满足,则执行您导入的speed_control()函数。将这些功能分解为模块的想法是帮助构建和维护它们。