Python 多处理而不锁定父进程



OS:- Mac OSX

我是使用 python 进行多处理的新手。对于我的应用程序,我想从 main 打开一个新进程并在不锁定主进程的情况下运行它。例如。我正在运行进程 A,现在我需要从 A 打开一个新应用程序,让我们称之为进程 B。我想以这样一种方式打开 B,它不会阻止进程 A,并且仍然从进程中,我应该能够随时停止进程。

到目前为止,我尝试过的任何代码都是基本的,它们锁定了进程 A.,因此我无法实现它。有什么解决方法可以做到这一点吗?

我读过关于分叉和生成的信息,但不明白如何使用它来打开应用程序。我也尝试过线程。但没有成功。谁能告诉我我该怎么做?

目前我正在使用subprocess.call()通过Python打开Mac应用程序。 这将非常有帮助。

编辑:-

我尝试了此链接的已接受答案 但无济于事。因为它会阻止终端,一旦我们手动关闭应用程序,它就会以输出 0 退出。

我也尝试过这个解决方案。它也会做同样的事情。我想使调用进程不会被被调用的进程阻止。

在使用 OS.System() 在 Windows 中执行相同的任务时,我完全符合我的需求。但是我不知道如何在Mac中执行此操作。

编辑2:代码

模块 1:

import subprocess

def openCmd(name):
subprocess.call(["/usr/bin/open", "-W", "-n", "-a", "/Applications/"+name+".app"])
def closeCmd(name):
subprocess.call(['osascript', '-e', 'tell "'+name+'" to quit'])

主模块:

import speech_recognition as sr
import pyttsx
import opCl

speech_engine = pyttsx.init('nsss')
speech_engine.setProperty('rate', 150)
OPEN_COGNATES=['open']
CLOSE_COGNATES=['close']
def speak(text):
speech_engine.say(text)
speech_engine.runAndWait()
re = sr.Recognizer()  
def listen():
with sr.Microphone() as source:
re.adjust_for_ambient_noise(source)

while True:
speak("Say something!")
print ">>",
audio = re.listen(source)
try:
speak("now to recognise it,")
value=re.recognize_google(audio)
print  (value)
speak("I heard you say {}".format(value))
value=value.strip().split()
name=" ".join(value[1:])
if value[0] in OPEN_COGNATES:
speak("opening "+name)
opCl.openCmd(name)
pass
elif value[0] in CLOSE_COGNATES:
speak("opening "+name)
opCl.closeCmd(name)
pass
else:
pass

except sr.UnknownValueError as e:
speak("Could not understand audio")
print ('Could not understand audio')
except sr.RequestError as e:
speak("can't recognise what you said.")
print ("can't recognise what you said")

if __name__=='__main__':
listen()

注释:它给出了回溯。FileNotFoundError: [Errno 2] 没有这样的文件或目录: 'leafpad'

正如我所写,我不能"/usr/bin/open"osascript,所以我的例子使用'leafpad'

您是否尝试过用您的
Popen(["/usr/bin/open", "-W", "-n", "-a", "/Applications/"+name+".app"])替换Popen([name])

您必须传递与从command line.
启动它相同的command args阅读以下内容:使用命令行启动操作系统上的应用程序

从 Python 重读 » 3.6.1 文档子流程。Popen
Noteshlex.split() 在确定 args 的正确标记化时很有用,尤其是在复杂的情况下:


Python » 3.6.1 文档
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
运行 args 描述的命令。等待命令完成,然后返回返回代码属性

你给出的"/usr/bin/open"osascript对我不起作用。

来自 Python » 3.6.1 文档子流程。例如,Popen
NOWAIT 示例

import subprocess
def openCmd(name):
subprocess.Popen([name])
def closeCmd(name):
subprocess.Popen(['killall', name])

if __name__ == '__main__':
while True:
key = input('input 1=open, 0=cloes, q=quit:')
if key == '1':
openCmd(('leafpad'))
if key == '0':
closeCmd('leafpad')
if key == 'q':
break

注意:杀死process可能会导致数据丢失和/或其他问题。

用 Python 测试:3.4.2<</strong>br/>我是

相关内容

  • 没有找到相关文章