Python多处理而不锁定父进程

时间:2017-04-04 16:31:15

标签: python macos multiprocessing python-multithreading

操作系统: - Mac OSX
的Python

我是使用python进行Multiprocessing的新手。对于我的应用程序,我想从main打开一个新进程并运行它而不锁定主进程。例如。我正在运行进程A,现在我需要从A打开一个新的应用程序,让我们称之为进程B.我想以这样的方式打开B,它不会阻止进程A仍然从进程i应该能够停止我希望这个过程。

直到现在我所尝试的任何代码都是基本的,它们会锁定进程A.因此我无法实现它。有没有办法解决这个问题?

我读到了关于fork和spawn但是无法理解我如何使用它来打开一个应用程序。我也尝试过线程。但没有成功。有谁能告诉我我该怎么做?

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

编辑: -

I tried the accepted answer of this link 但无济于事。因为它会阻止终端,一旦我们手动关闭应用程序,它就会以输出0退出。

我也试过这个solution。它会做同样的事情。我想让调用进程不被被调用进程阻塞。

在使用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()

1 个答案:

答案 0 :(得分:0)

  

评论:它给了追溯。 FileNotFoundError:[Errno 2]没有这样的文件或目录:'leafpad'

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

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

您必须从command args开始传递相同的command line 阅读:launch-an-app-on-os-x-with-command-line

  

重读 From Python » 3.6.1 Documentation subprocess.Popen
  注意   在确定args的正确标记化时,shlex.split()非常有用,特别是在复杂情况下:

  

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

您指定的"/usr/bin/open"osascript对我不起作用。

From Python » 3.6.1 Documentation subprocess.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