Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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 - Fatal编程技术网

同时运行python脚本的问题

同时运行python脚本的问题,python,Python,我有两个python脚本,在我正在处理的项目中使用了两个不同的摄像头,我正在尝试在不同的脚本中或在彼此之间运行它们,无论哪种方式都可以 import os os.system('python 1.py') os.system('python 2.py') 但我的问题是,它们不会同时运行,我必须退出第一个,等待下一个打开。我还尝试使用bash和&shell操作符来实现它 python 1.py & python 2.py & 事实上,这确实使它们都在运行,但问题是它们都在后

我有两个python脚本,在我正在处理的项目中使用了两个不同的摄像头,我正在尝试在不同的脚本中或在彼此之间运行它们,无论哪种方式都可以

import os

os.system('python 1.py')

os.system('python 2.py')
但我的问题是,它们不会同时运行,我必须退出第一个,等待下一个打开。我还尝试使用bash和&shell操作符来实现它

python 1.py &
python 2.py &

事实上,这确实使它们都在运行,但问题是它们都在后台无休止地运行,我需要很容易地关闭它们。任何建议我可以做些什么来避免这些实现的问题一种可能的方法是使用
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 list-units
您还可以通过以下方式检查其状态:

systemctl status my_daemon
停止
/
重新启动
它们,方法是:

systemctl stop|restart my_daemon
你可以用它来做

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

pid = Popen("python 1.py").pid

然后检查是否与子进程通信,并检查它是否仍在运行。

因为python脚本是程序,在用户不决定关闭它们或错误引发第一条语句阻止调用程序之前,它们永远不会结束。因此,除非您关闭
python1.py
,否则python显然永远不会执行下一条语句,在您的情况下,这是另一个无休止的程序
python2.py
。为了解决这个问题,您需要创建两个新的流程,比如分叉子流程时(查看流程概念),并以某种方式与进行通信。我认为他不希望在某个固定时间后终止调用的脚本。这更像是执行这两个脚本并等待它们何时关闭,所以检查最后的条件并退出。所以你需要等待它们各自独立终止,脚本关闭的顺序。他说它们永远运行,他需要能够关闭它们它们它们都在后台无休止地运行,我需要非常轻松地关闭它们,所以我的代码就是这样做的。但是,如果您想等待它们完成,只需使用
terminate()
函数删除行,并保留
join()
这将等待进程完成。我尝试了当前的代码,它启动了两个程序,但实际上并没有用timerI终止它们。我用运行无限循环的python程序测试了它,发现了同样的问题。我修复了它使用,你可以尝试代码现在。工程像一个魅力
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()))
pid = Popen("python 1.py").pid