【问题标题】:Python multiprocessing without locking the parent processPython多处理而不锁定父进程
【发布时间】:2017-08-29 23:39:13
【问题描述】:

操作系统:- Mac OSX
Python

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

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

我阅读了关于 fork and spawn 的文章,但不明白如何使用它来打开应用程序。我也尝试过线程。但没有成功。谁能告诉我该怎么做?

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

编辑:-

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

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

在 windows 中使用 os.system() 执行相同的任务时,这正是我想要的。但我不知道如何在 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()

【问题讨论】:

  • @stovfl 我编辑了这个问题。我希望现在它会有所帮助。
  • 我希望它现在可以工作@stovfl

标签: python macos multiprocessing python-multithreading


【解决方案1】:

评论:它给出了回溯。 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
注意 shlex.split() 在确定 args 的正确标记化时很有用,尤其是在复杂情况下:


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

您给定的 "/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 测试
我是

【讨论】:

  • 它给出了回溯。 FileNotFoundError: [Errno 2] No such file or directory: 'leafpad' 尝试使用 safari 的事件未打开应用程序。我正在尝试使用 python 3.6.1 FileNotFoundError: [Errno 2] No such file or directory: 'safari'
  • 谢谢人。它现在起作用了。但是 idk killall 没有用。相反['osascript', '-e', 'tell application"'+name+'" to quit'] 这有效。非常感谢。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2012-12-16
相关资源
最近更新 更多