操作系统: - 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()
答案 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
我