如何从另一个脚本导入变量?

2024-07-03 06:54:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个在python上运行的quadcopter。在

script1是一个让我控制4个马达速度的过程。在

script2应该是一个调节马达的过程,以使我的四旋翼机保持稳定。在

我在script1.py中有一个变量motorspeed,我想把它导入script2.py。我试过了

from script1.py import motorspeed

但是,这只启动script1.py,而不执行script2。由于script1.py是while循环,script2.py永远不会执行。while循环确实结束了,当我按下一个按钮(它关闭了quadcopter),所以我需要在script1.py运行时运行script2.py。我如何得到script2.py中的变量motorspeed来增加和降低电机的速度?在


Tags: frompyimport过程按钮速度电机while
3条回答

你可以试试

from script1 import motorspeed

根据你所描述的,你只需要实时改变速度。所以基本上你不应该在你的script1中放一个while循环。script1应该只关注控制put(与机器接口)。然后在你的script2(在你的例子中是main),你应该把你的while循环放进去。在

你不需要多个过程。您只需要寻找一些基本的并发性(即,在同一时间执行多个任务,而不需要一个阻塞另一个),从而可以使用线程。在

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

^{pr2}$

运行script2.py几秒钟的输出:

91131.589991
191556.080026
283986.210112
384517.350206

基本上,你想把电机的速度从一个运行的script1.py发送到一个正在运行的script2.py,对吗?在

注意:从一个文件导入某个文件不会将该文件作为一个单独的进程运行!在

要使正在运行的程序交换数据,必须

  1. 运行程序
  2. 设置进程间通信(“IPC”)或它们之间的共享内存。在

至少有三种方法可以启动两个脚本,使它们同时运行。在

A)从命令行

python script1.py &
python script2.py &

B)使用subproces。在script1.pydo中

^{pr2}$

C)使用multiprocessing

import multiprocessing as mp
import script2

p = mp.Process(target=script2.main)  # Assuming script2 has a main function.
p.start()

如何进行IPC取决于如何启动脚本。在

在这三种情况下,您都可以使用sockets作为通信手段。您必须将script2设置为所选端口号(比如12345)上的服务器。如果script1想要增加或降低电机速度,它将连接到端口12345并发送包含新电机速度的消息。除了链接的howto之外,还有很多socket教程,这里的详细答案可能太长了。在

如果选择使用multiprocessing(选项C),则可以使用共享内存^{}。在

# 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是不可取的,那么可以设置^{}。在

# 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路线,因为它有最简单的建立沟通的方式。在

相关问题 更多 >