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

时间:2016-05-29 09:16:30

标签: python variables import

我正在构建一个在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以增加和降低电机的速度?

4 个答案:

答案 0 :(得分:2)

基本上,您想要将电机速度从正在运行的script1.py发送到正在运行的script2.py,对吗?

注意:从文件导入内容将该文件作为单独的进程运行!

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

  1. 运行程序
  2. 设置进程间通信(" IPC")或它们之间的共享内存。
  3. 启动两个脚本至少有三种方法可以同时运行。

    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()函数。将这些功能分解为模块的想法是帮助构建和维护它们。