Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从另一个脚本导入变量?_Python_Variables_Import - Fatal编程技术网

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

我正在建造一架在python上运行的四架直升机

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
,对吗

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

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

  • 运行程序
  • 设置进程间通信(“IPC”)或它们之间的共享内存
  • 至少有三种方法可以启动两个脚本,使它们同时运行

    A) 从命令行

    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应该从编写最简单的代码开始,然后转向更复杂的解决方案