【问题标题】:python subprocess: how to run an app on OS X?python 子进程:如何在 OS X 上运行应用程序?
【发布时间】:2012-10-15 20:20:14
【问题描述】:

我正在将一个 Windows 应用程序移植到 OS X 10.6.8。这对我来说是一个新平台,我面临一些困难。

该应用程序是一个小型网络服务器(bottle+waitress),它通过子进程调用启动浏览器(基于 chromium 嵌入式框架)。

浏览器是一个应用文件,从gui启动时运行正常。

我是这样启动的:

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

但是

subprocess.Popen(['open', '-a', os.getcwd()+'/cef/cefclient.app', '--args', '--url-http://127.0.0.1:8100'])

失败并出现以下错误

FSPathMakeRef(/Users/.../cefclient.app) failed with error -43.

知道如何解决这个问题吗?

【问题讨论】:

  • os.getcwd()+'cef/cefclient.app' 看起来不对。对我来说,getcwd() 没有添加斜杠。 os.path.join(os.getcwd(), 'cef/cefclient.app') 可能会让你的运气更好
  • 您确定打开后需要 -a 吗?我相信只有当您尝试“打开”一个文档并且需要提供用于打开该文档的应用程序的名称时,您才需要这样做。
  • 正确的 / 在 getcwd 之后丢失。无论如何,命令仍然失败

标签: python macos osx-snow-leopard subprocess


【解决方案1】:

或者,

os.system('open -a "cef/cefclient.app" --args --url-http://127.0.0.1:8100')

只是取决于你是想控制标准输入/标准输出还是启动应用程序就足够了。

【讨论】:

    【解决方案2】:

    文件cefclient.app 实际上是一个目录(特别是application bundle),而不是应用程序可执行文件。真正的可执行文件位于包内,路径类似于Contents/MacOS/executable_name。所以要启动它,你可以这样做:

    subprocess.Popen([os.getcwd()+"/cef/cefclient.app/Content/MacOS/executable_name",
                      "--url=http://127.0.0.1:8100"])
    

    【讨论】:

    • 不过,使用 open -a "Application Path" [arguments to app] 应该可以。例如。 open -a /Applications/Google\ Chrome.app http://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"]) 为我工作(上面,google.com 是被告知使用 Google Chrome 打开的“文件”,而不是传递给 Chrome 的参数)
    • 这可行,但如果我使用“open”命令(启动 Mac OS-X 代码包(如 .app 应用程序)所必需的 - 子进程属于“open”进程,而不是实际的 App我正在启动。有什么方法可以获取我要启动的真实应用程序的子进程?
    • 它可以工作,但是......首先,Popen 对象代表“打开”进程,而不是 Chrome.app,其次 -“打开”是非常短暂的,所以你不要'不要掌握实际的应用程序——以防你想捕获它的输入/输出、与之通信,甚至杀死它。所以,这个解决方案远非完美;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2016-04-18
    • 2014-11-25
    相关资源
    最近更新 更多