python子流程:如何在OS X上运行应用程序?
我正在将windows应用程序移植到OS X 10.6.8。这对我来说是一个新的平台,我面临着一些困难 该应用程序是一个小型Web服务器(瓶子+服务员),由于子流程调用,它正在启动浏览器(基于chromium嵌入式框架) 浏览器是一个应用程序文件,从gui启动时运行正常 我是这样发起的:python子流程:如何在OS X上运行应用程序?,python,macos,osx-snow-leopard,subprocess,Python,Macos,Osx Snow Leopard,Subprocess,我正在将windows应用程序移植到OS X 10.6.8。这对我来说是一个新的平台,我面临着一些困难 该应用程序是一个小型Web服务器(瓶子+服务员),由于子流程调用,它正在启动浏览器(基于chromium嵌入式框架) 浏览器是一个应用程序文件,从gui启动时运行正常 我是这样发起的: subprocess.Popen([os.getcwd()+"/cef/cefclient.app", '--url=http://127.0.0.1:8100']) 不幸的是,这在OSError:permi
subprocess.Popen([os.getcwd()+"/cef/cefclient.app", '--url=http://127.0.0.1:8100'])
不幸的是,这在OSError:permission denied
的情况下失败
我尝试使用sudo
运行脚本,结果类似
我可以使用以下命令从shell启动应用程序:
open -a "cef/cefclient.app" --args --url-http://127.0.0.1:8100
但是
失败,出现以下错误
FSPathMakeRef(/Users/.../cefclient.app) failed with error -43.
知道如何解决这个问题吗?文件
cefclient.app
实际上是一个目录(具体来说是一个目录),而不是应用程序的可执行文件。真正的可执行文件位于包中,路径类似于Contents/MacOS/executable\u name
。因此,要启动它,您需要执行以下操作:
subprocess.Popen([os.getcwd()+"/cef/cefclient.app/Content/MacOS/executable_name",
"--url=http://127.0.0.1:8100"])
文件
cefclient.app
实际上是一个目录(特别是一个目录),而不是应用程序的可执行文件。真正的可执行文件位于包中,路径类似于Contents/MacOS/executable\u name
。因此,要启动它,您需要执行以下操作:
subprocess.Popen([os.getcwd()+"/cef/cefclient.app/Content/MacOS/executable_name",
"--url=http://127.0.0.1:8100"])
或者
os.system('open -a "cef/cefclient.app" --args --url-http://127.0.0.1:8100')
这取决于你是否想要控制stdin/stdout或者启动应用程序是否足够 或者
os.system('open -a "cef/cefclient.app" --args --url-http://127.0.0.1:8100')
这取决于你是否想要控制stdin/stdout或者启动应用程序是否足够 使用
open-a“应用程序路径”[应用程序参数]
应该可以工作。例如,open-a/Applications/Google\Chrome.apphttp://www.google.com
在我的Chrome会话中打开Google。您的解决方案将启动该应用程序的另一个实例——这是您在OS X上通常不会执行的操作。因此,它应该是Popen(['open','-a','cef/cefclient.app','-args','-url)-http://127.0.0.1:8100“])
?是的,这似乎适合我subprocess.Popen(['open','-a',“/Applications/Google Chrome.app”])
对我有效(上面是open被告知用Google Chrome打开的“文件”,而不是传递给Chrome的参数),这是有效的,但如果我使用“open”命令(启动Mac OS-X代码包(如.app Applications)所必需的),则子流程是“open”的进程,而不是我正在启动的实际应用程序。有没有办法抓取我想要启动的实际应用程序的子进程?它可以工作,但是…首先,Popen对象代表“打开”进程,而不是Chrome.App,其次,“打开”非常短暂,因此你无法抓到实际应用程序-如果你想捕获其输入/输出,common因此,这个解决方案还远远不够完美;使用open-a“Application Path”[应用程序参数]
应该可以工作,例如open-a/Applications/Google\Chrome.apphttp://www.google.com
在我的Chrome会话中打开Google。您的解决方案将启动该应用程序的另一个实例——这是您在OS X上通常不会执行的操作。因此它应该是Popen(['open'、'-a'、'cef/cefclient.app'、'-args'、'-url-http://127.0.0.1:8100“]
?是的,这似乎对我有效。subprocess.Popen(['open','-a',“/Applications/Google Chrome.app]”)
对我有效(上面是open被告知用Google Chrome打开的“文件”,不是传递给Chrome的参数)这有效,但如果我使用“open”命令(启动Mac OS-X代码包(如.app应用程序)所必需的-子流程是“开放的”进程,而不是我正在启动的实际应用程序。有没有办法抓取我想要启动的实际应用程序的子进程?它可以工作,但是…首先,Popen对象代表“打开”进程,而不是Chrome.App,其次,“打开”非常短暂,因此你无法抓到实际应用程序-如果你想捕获其输入/输出,common因此,这个解决方案还远远不够完美;os.getcwd()+'cef/cefclient.app'
看起来不太合适。对我来说,getcwd()
没有添加尾随斜杠。使用os.path.join(os.getcwd(),'cef/cefclient.app')可能会更走运
您是否绝对确定在打开文档后需要-a?我相信您只希望在尝试“打开”文档并且需要提供用于打开该文档的应用程序的名称时使用-a。getcwd后缺少右/。无论如何,该命令仍然失败os.getcwd()+“cef/cefclient.app”
看起来不对劲。对我来说,getcwd()
没有添加尾随斜杠。你可能会更幸运地使用os.path.join(os.getcwd(),'cef/cefclient.app')
你绝对确定在打开后需要-a吗?我相信你只有在尝试“打开”时才需要它一个文档,需要提供用于打开该文档的应用程序的名称。getcwd之后,/缺失。无论如何,该命令仍然失败