我们如何 运行 2 python 脚本并行共享一个公共变量?
How can we run 2 python scripts that share a common variable in parallel?
首先让我解释一下场景。
我的项目是使用 Django 构建的。
我有一个前端,我们可以在其中上传一个人的图像。该图像将存储在我们本地计算机的(媒体文件夹)中。
例如:如果图像名称是jon.jpeg
,那么它将被存储为
media
-jon
--jon.jpeg
如果上传了另一张图片,比如bob.jpg
,那么结构将是这样的:
media
-jon
--jon.jpeg
-bob
--bob.jpg
现在我有一个 Python 脚本(比如说 check.py
),我们在其中 运行 一个无限循环,它每 5 秒检查一次媒体中的文件夹数量文件夹。此外,我们在 check.py
中维护一个全局变量,它将跟踪 initial_count.
现在我有另一个 Python 文件 运行(即 camera.py
),它有 2 个函数,即 load_encodings
和 recognize
在 class 调用了 Face_Recog
.
load_encodings
会将媒体文件夹中的图像转换为特征编码,并将这些编码存储在 camera.py
文件中的全局列表 (known_faces
) 中。
recognize
会先从一个相机帧中提取图像并进行编码,然后将其与known_faces
.
中的编码进行比较
现在,每当 media
中的文件夹数量发生变化时,(如果我们从前端上传图像),那么 initial_count
中的 check.py
中的文件夹数量也会发生变化。我们给出了一个条件,如果 initial_count
值发生变化,它将调用 camera.py
文件的 encoding
函数。
check.py
from camera import Face_Recog,object
initial_count = 0
while True:
count = 0
for path in os.listdir(path/to/media):
count += 1
global initial_count
if count != initial_count:
Face_Recog.load_encodings(object)
initial_count = count
sleep(5)
camera.py
known_faces = []
class Face_Recog(object):
def load_encodings(self):
temp = []
#some code that will change the temp value , i.e it will load the image from media and then encode it and store the encoding in temp
global known_faces
known_faces = temp
def recognize(self):
while(True):
#code that uses known_faces and recognizes
object = Face_Recog()
object.load_encodings()
object.recognize()
现在我 运行 这两个文件在 2 个不同的 shell 中。
最初媒体文件夹仅包含 jon
,因此 known_faces
将仅包含 jon
的编码。
known_faces = ['jon']
和recognize
函数不会识别bob
,它只会识别jon
。
(这是有效的。)
现在当我上传bob
的图片时,initial_count
的值会在check.py
中改变,它会调用camera.py
的load_encodings
函数(它正在调用它;我已经使用打印语句进行了检查)。
现在这个函数将再次对存在的图像进行编码,即 jon
和 bob
,并更新全局变量,即 known_faces
.
(正在更新,但仅在check.py
为运行的shell,不在shell 运行 camera.py
. 即它没有反映 camera.py
文件的 known_faces
变量的变化,在不同的 shell 实例中是 运行。
因此,即使它正在更改 known_faces
变量,recognize
函数也无法识别 bob
,即它正在使用的变量 (known_faces
) 不是自动更新。
我想做一些事情,比如每当有人从前端上传任何图像时,它的编码应该在文件中更新 (camera.py
) 而相机不会停止,即 recognize
函数不应该停止执行。
PS。注意:这两个文件,即 camera.py
和 check.py
在 2 个不同的 shell 中始终是 运行。
请告诉我是否可行,或者是否有其他方法可以实现此目的。
针对您的情况最简单的解决方法可能是 check.py
监视文件并在必要时重新启动其他进程。
首先让我解释一下场景。
我的项目是使用 Django 构建的。
我有一个前端,我们可以在其中上传一个人的图像。该图像将存储在我们本地计算机的(媒体文件夹)中。
例如:如果图像名称是jon.jpeg
,那么它将被存储为
media
-jon
--jon.jpeg
如果上传了另一张图片,比如bob.jpg
,那么结构将是这样的:
media
-jon
--jon.jpeg
-bob
--bob.jpg
现在我有一个 Python 脚本(比如说 check.py
),我们在其中 运行 一个无限循环,它每 5 秒检查一次媒体中的文件夹数量文件夹。此外,我们在 check.py
中维护一个全局变量,它将跟踪 initial_count.
现在我有另一个 Python 文件 运行(即 camera.py
),它有 2 个函数,即 load_encodings
和 recognize
在 class 调用了 Face_Recog
.
load_encodings
会将媒体文件夹中的图像转换为特征编码,并将这些编码存储在 camera.py
文件中的全局列表 (known_faces
) 中。
recognize
会先从一个相机帧中提取图像并进行编码,然后将其与known_faces
.
现在,每当 media
中的文件夹数量发生变化时,(如果我们从前端上传图像),那么 initial_count
中的 check.py
中的文件夹数量也会发生变化。我们给出了一个条件,如果 initial_count
值发生变化,它将调用 camera.py
文件的 encoding
函数。
check.py
from camera import Face_Recog,object
initial_count = 0
while True:
count = 0
for path in os.listdir(path/to/media):
count += 1
global initial_count
if count != initial_count:
Face_Recog.load_encodings(object)
initial_count = count
sleep(5)
camera.py
known_faces = []
class Face_Recog(object):
def load_encodings(self):
temp = []
#some code that will change the temp value , i.e it will load the image from media and then encode it and store the encoding in temp
global known_faces
known_faces = temp
def recognize(self):
while(True):
#code that uses known_faces and recognizes
object = Face_Recog()
object.load_encodings()
object.recognize()
现在我 运行 这两个文件在 2 个不同的 shell 中。
最初媒体文件夹仅包含 jon
,因此 known_faces
将仅包含 jon
的编码。
known_faces = ['jon']
和recognize
函数不会识别bob
,它只会识别jon
。
(这是有效的。)
现在当我上传bob
的图片时,initial_count
的值会在check.py
中改变,它会调用camera.py
的load_encodings
函数(它正在调用它;我已经使用打印语句进行了检查)。
现在这个函数将再次对存在的图像进行编码,即 jon
和 bob
,并更新全局变量,即 known_faces
.
(正在更新,但仅在check.py
为运行的shell,不在shell 运行 camera.py
. 即它没有反映 camera.py
文件的 known_faces
变量的变化,在不同的 shell 实例中是 运行。
因此,即使它正在更改 known_faces
变量,recognize
函数也无法识别 bob
,即它正在使用的变量 (known_faces
) 不是自动更新。
我想做一些事情,比如每当有人从前端上传任何图像时,它的编码应该在文件中更新 (camera.py
) 而相机不会停止,即 recognize
函数不应该停止执行。
PS。注意:这两个文件,即 camera.py
和 check.py
在 2 个不同的 shell 中始终是 运行。
请告诉我是否可行,或者是否有其他方法可以实现此目的。
针对您的情况最简单的解决方法可能是 check.py
监视文件并在必要时重新启动其他进程。