我想从
master script
同时运行两个或多个 python 脚本。这些脚本中的每一个都已经有并行运行的线程。例如我跑步
script1.py
if __name__ == '__main__':
pid_vav = PID_VAV('B2')
t1 = threading.Thread(target=pid_vav.Controls)
t1.daemon = False
t1.start()
t2 = threading.Thread(target=pid_vav.mqttConnection)
t2.daemon = False
t2.start()
script2.py
if __name__ == '__main__':
pid_vav = PID_VAV('B4')
t1 = threading.Thread(target=pid_vav.Controls)
t1.daemon = False
t1.start()
t2 = threading.Thread(target=pid_vav.mqttConnection)
t2.daemon = False
t2.start()
我分别运行这个
script1.py
和 script2.py
。唯一的区别是我传递给类的参数。是否有可能有一个主脚本,这样如果我只运行它,这两个脚本都会运行?
谢谢
假设您希望在运行主脚本时显示两个脚本的输出。
您可以使用
subprocess
模块来调用 python 文件,并且可以使用 threading
模块来启动单独的线程
from threading import Thread
import subprocess
t1 = Thread(target=subprocess.run, args=(["python", "script1.py"],))
t2 = Thread(target=subprocess.run, args=(["python", "script2.py"],))
t1.start()
t2.start()
t1.join()
t2.join()
如果您想从主脚本触发 2 个脚本,您可以使用以下方法。 它将帮助您将两个脚本作为线程触发,并且线程还可以根据可调用脚本生成不同的线程。您甚至可以使脚本独立运行。
import subprocess
pid1 = subprocess.Popen([sys.executable, "script1.py"])
pid2 = subprocess.Popen([sys.executable, "script2.py"])
是的,ofc。
script_master.py:
from os import system
system('start script1.py && start script2.py')
但我认为你可以使用这段代码:
script_together.py:
if __name__ == '__main__':
todo=[]
todo.append(threading.Thread(target=lambda: PID_VAV('B2').Controls, daemon=False))
todo.append(threading.Thread(target=lambda: PID_VAV('B4').mqttConnection, daemon=False))
for th in todo:
th.start()
for th in todo:
th.join()
如果您愿意将两者的代码都放在一个文件中,则可以使用多处理在不同的 CPU 内核上同时运行它们。
import multiprocessing as mp
from threading import Thread
def start_process(pid_vav_label):
pid_vav, threads = PID_VAV(pid_vav_label), []
threads.append(Thread(target=pid_vav.Controls))
threads.append(Thread(target=pid_vav.mqttConnection))
for thread in threads:
thread.start()
# Join if necessary
for thread in threads:
thread.join()
if __name__ == '__main__':
processes = []
for label in ['B2', 'B4']:
processes.append(mp.Process(target=start_process, args=(label,)))
processes[-1].start()
# Again, can join if necessary
for process in processes:
process.join()