同时运行python脚本的问题

时间:2018-11-23 19:25:37

标签: python

我有两个python脚本,它们针对正在处理的项目使用两个不同的摄像头,并且试图在不同的脚本中或彼此之间运行它们,这两种方法都很好。

#include <map>

using t_Key = long int;
using t_Value = long int;
using t_Comparator = bool ( * )(t_Key const left, t_Key const right);
using t_Map = ::std::map<t_Key, t_Value, t_Comparator>;

bool Is_Less(t_Key const left, t_Key const right)
{
    return left < right;
}

bool Is_Greater(t_Key const left, t_Key const right)
{
    return left > right;
}

int main()
{
    int Side{};
    t_Map current_book{(Side == 1) ? &Is_Less : &Is_Greater};
    return 0;
}

但是,我的问题是它们不能同时运行,我必须退出第一个才能打开下一个。我还尝试了使用bash以及&shell运算符

import os

os.system('python 1.py')

os.system('python 2.py')

这确实使它们都运行,但是问题是它们都在后台无休止地运行,因此我需要相当容易地将它们关闭。任何建议我可以做些什么来避免这些实现的问题

3 个答案:

答案 0 :(得分:2)

您可以使用multiprocessing

import os
import time
import psutil
from multiprocessing import Process

def run_program(cmd):
    # Function that processes will run
    os.system(cmd)

# Initiating Processes with desired arguments
program1 = Process(target=run_program, args=('python 1.py',))
program2 = Process(target=run_program, args=('python 2.py',))

# Start our processes simultaneously
program1.start()
program2.start()

def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()

# Wait 5 seconds and kill first program
time.sleep(5)
kill(program1.pid)
program1.join()

# Wait another 1 second and kill second program
time.sleep(1)
kill(program2.pid)
program2.join()

# Print current status of our programs
print('1.py alive status: {}'.format(program1.is_alive()))
print('2.py alive status: {}'.format(program2.is_alive()))

答案 1 :(得分:0)

一种可能的方法是使用systemd来控制您的进程(即将其视为守护程序)。

这是我控制我的Python服务器的方式,因为它们需要在后台运行并与当前的tty完全分离,以便退出与计算机的连接,并继续执行继续的过程。然后,您也可以稍后使用systemctl停止服务器,如下所述。

说明:

创建一个.service文件并将其保存在/etc/systemd/system中,内容如下:

[Unit]
Description=daemon one

[Service]
ExecStart=/path/to/1.py

,然后重复一次,转到2.py

然后,您可以使用systemctl控制守护程序。

首先使用以下命令重新加载所有配置文件:

systemctl daemon-reload

然后启动您的两个守护进程(其中my_daemon.service是您的单元文件之一):

systemctl start my_daemon

它现在应该正在运行,您应该在以下位置找到它:

systemctl list-units

您还可以通过以下方式查看其状态:

systemctl status my_daemon

stop / restart与他们:

systemctl stop|restart my_daemon

答案 2 :(得分:0)

使用subprocess.Popen。这将创建一个子进程并返回其pid。

onClick()

然后检出these functions与子进程进行通信并检查子进程是否仍在运行。