同时运行两个Python文件

6
我尝试使用过。
#!/bin/bash
python ScriptA.py &
python ScriptB.py &

在同一时间运行两个脚本,但是无论如何都会出现“语法无效”的错误提示,即使ScriptA的所有python文件都在同一个文件夹中。以下是同时运行两个脚本的文件:
def song():
user = input()
    if user == "Chance":
        python ScriptA.py &
        python ScriptB.py &
   else:
        print("Error")

我找到的解决方案,比如把那个脚本放在一行中,不起作用,因为错误仍然显示。
--------------------------编辑--------------------------
这两个脚本单独运行都很好,但是你提供的所有解决方案仍然按顺序运行。脚本A是通过OpenCV播放的视频,脚本B是通过playsound播放的歌曲。
ScriptA:
import cv2
import numpy as np
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
cap = cv2.VideoCapture("video.mp4")
while(cap.isOpened()):
  ret, frame = cap.read()
  if ret == True:
    cv2.imshow('Frame',frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
      break
  else:
    break
cap.release()
cv2.destroyAllWindows()

ScriptB:

from playsound import playsound
a = (r"C:\Users\A\Desktop\sound.mp3")
playsound(a)

您可能已经注意到,我正在尝试在视频旁边显示一首歌曲。我尝试了播放带有声音的视频,但是由于某种原因,openCV无法输出声音。有什么建议吗?


1
当您单独执行这两个脚本时,它们都可以正常工作吗? - Mufeed
第二个代码片段是哪种语言?或者说,它是用来做什么的?在sh和python中都是无效的语法。 - William Pursell
@Mufeed提出了正确的问题。 "Invalid Syntax"错误与文件在同一文件夹中无关。 可能是因为您的ScriptA.py中存在Python语法错误,因为您提供的Python脚本也存在语法错误。 - atakanyenel
澄清一下,当单独执行时,这两个脚本都可以完美运行。 - A.J
由于Python中的全局解释器锁(GIL),一次只能运行一个线程,请查看此处当同时运行两个函数时,线程无法减少运行时间 - Santhosh Dhaipule Chandrakanth
4个回答

9

我认为你正在寻找多线程功能。

你可以将两个脚本合并到另一个脚本中,然后使用线程启动它们。

--编辑--

from threading import Thread

import cv2
import numpy as np
import os
from playsound import playsound

def play_sound(): 
    # import your script A
    a = (r"C:\Users\A\Desktop\sound.mp3")
    playsound(a)

def CV2_stuff():
    # import your script B
    os.environ['SDL_VIDEO_CENTERED'] = '1'
    cap = cv2.VideoCapture("video.mp4")
    ...


Thread(target = play_sound).start() 
Thread(target = CV2_stuff).start()

希望能对您有所帮助

这也可以起作用

import ScriptA
import ScriptB

ScriptA.function()
ScriptB.function()

但它们不会同时执行。


我尝试过了,但仍然没有运气。我已经编辑了原始帖子以帮助澄清我的情况。 - A.J
我的解决方案是创建一个带有两个函数的脚本,然后使用线程调用它们,我也会编辑我的帖子 :) - Peko Chan
1
非常感谢你,Peko,它起作用了!现在我所要做的就是弄清楚如何循环播放视频直到歌曲结束,以便视频可以结束并返回另一个脚本。 - A.J

3
你需要导入os模块,并使用其中的system函数,然后通过&&将你正在运行的两个Python文件分开。
import os
def song():
    user = input()
    if user == "Chance":
        os.system('python ScriptA.py && python ScriptB.py')
    else:
        print("Error")

song()

我建议你将想要运行的两个文件导入第三个文件中,然后像普通函数一样运行其中的函数。

例如:

import ScriptA
import ScriptB

ScriptA.function()
ScriptB.function()

如果脚本中没有函数,那么它们被导入后会立即运行。

这不会按照 OP 所期望的并行运行。你可能需要在两个不同的线程中调用这些函数。 - penguin2048
正如Penguin所述,它不会并行运行,我在原帖中包含了更多信息。 - A.J

1
你可以尝试使用 os.system :
import os

os.system("python ScriptA.py &")
os.system("python ScriptB.py &")

我尝试过了,但它仍然按顺序显示。我已经更新了我的原始帖子以帮助理解我想要做什么。 - A.J

0

你可以在Python IDLE中打开这两个文件并分别运行它们。

如果你需要同时运行这两个文件(第一种方式需要按下F5键来延迟),你可以使用PyCharm并下载multirun插件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接