Python 如何从另一个脚本导入变量?
我正在建造一架在python上运行的四架直升机Python 如何从另一个脚本导入变量?,python,variables,import,Python,Variables,Import,我正在建造一架在python上运行的四架直升机 script1是一个让我控制4个电机速度的过程 script2应该是一个调节电机的过程,以使我的四架直升机保持稳定 我在script1.py中有一个变量motorspeed,我想将它导入script2.py。我试过了 从script1.py导入motorspeed 但是,这只会启动script1.py,而不会执行script2。由于script1.py是一个while循环,script2.py永远不会执行。当我按下按钮(关闭四架直升机)时,whil
script1
是一个让我控制4个电机速度的过程
script2
应该是一个调节电机的过程,以使我的四架直升机保持稳定
我在script1.py
中有一个变量motorspeed
,我想将它导入script2.py
。我试过了
从script1.py导入motorspeed
但是,这只会启动script1.py
,而不会执行script2
。由于script1.py
是一个while循环,script2.py
永远不会执行。当我按下按钮(关闭四架直升机)时,while循环确实结束了,因此我需要在script1.py
运行时运行script2.py
。如何在script2.py
中获取变量motorspeed
,以增加和降低电机的速度?您可以尝试
from script1 import motorspeed
根据您所描述的,您只需要实时更改速度。所以基本上你不应该在
script1
中加入while循环。script1
应仅关注控制输入(与机器接口)。然后在你的script2
(在你的例子中是main)中,你应该把放在while
循环中。基本上,你想把电机的速度从运行的script1.py
发送到运行的script2.py
,对吗
注意:从文件导入内容不会将该文件作为单独的进程运行
要使正在运行的程序交换数据,您必须
python script1.py &
python script2.py &
B) 使用子功能
。在script1.py中
do
import subprocess as sp
sp.Popen(['python', 'script2.py'])
C) 使用多处理
import multiprocessing as mp
import script2
p = mp.Process(target=script2.main) # Assuming script2 has a main function.
p.start()
如何执行IPC取决于如何启动脚本
在这三种情况下,你都可以用它作为交流的手段。您必须将script2
设置为所选端口号(比如12345)上的服务器。如果script1
想要提高或降低电机速度,它将连接到端口12345并发送一条包含新电机速度的消息。除了链接的howto之外,还有很多socket教程,这里的详细答案太长了
如果选择使用多处理
(选项C),则可以使用共享内存
当然script2.main
应该识别一个参数!
这两个进程现在都可以操纵motorspeed
对象
如果不希望script2
也可以更改motorspeed
您可以设置一个
在这种情况下,script2.main
应该定期阅读消息
总而言之,我建议您选择
多处理
路线,因为它有最简单的通信方式。您不需要多个进程。您只是在寻找一些基本的并发性(即,在不阻塞另一个的情况下同时执行多个任务),您可以使用线程来实现这些并发性
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()
from time import sleep
# from script1 import motorspeed will not work
import script1
while True:
sleep(1)
print(script1.motorspeed)
script2.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()
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
除非同时运行两个脚本,否则在一个脚本中导入变量可能会得到实际期望的值。为了传递变量,您必须启动这两个脚本并管理一些进程间通信 或者可以使用ZeroMQ或RabbitMQ之类的消息队列来实现这一点 这种代码体系结构感觉不正确。您不会将变量从一个python脚本导入到另一个python脚本。相反,您可以将电机的速度控制功能作为函数放在一个脚本中作为函数,然后将该函数导入到第二个函数中 根据功能划分模块并将其放入函数中。 然后,在您执行的主python文件中,您可以在需要时调用函数speed_control() 我不是quadcopter方面的专家,但让我为python代码推荐以下体系结构 假设您将马达转速控制功能放入名为msc.py的模块中,并将获取传感器数据的功能放入sense.py中
现在在stability.py中,您可以在while循环中不断检查传感器数据,如偏航或俯仰,如果条件满足,则执行导入的speed_control()函数。将这些功能拆分为模块的想法是为了帮助构建和维护它们。您需要显示问题所在代码的最小抽象。请注意,您不包括
.py
-您从中导入的模块可以是文件或目录。如果在script1.py
中有一个while
循环,即使在导入时也会启动,而且永远不会结束,那么您怎么能从中得到任何东西呢?从script1 import motorspeed
中,如果两者都在同一个目录中。请注意,在Cpython中,一次只能有一个线程执行python字节码。因此,如果表示script1
的线程正在运行,则表示script2
的线程可以执行I/O操作,但无法运行。这可能会在此类实时任务中产生不良后果。因此,在这种情况下,可能最好使用单独的流程。使用进程还意味着您可以用C语言重写script2
,如果Python对该任务来说太慢。@RolandSmith两个进程只能将速度提高大约2倍。如果OP的代码在我的解决方案中计算速度不够快,无法正确控制四角机,那么他需要更好的算法,而不是多重处理。OP应该从编写最简单的代码开始,然后转向更复杂的解决方案