2012-10-25 2 views
0

Я переношу приложение Windows в OS X 10.6.8. Это новая платформа для меня, и я сталкиваюсь с некоторыми трудностями.Подпроцесс python: как запустить приложение на OS X?

Приложение представляет собой небольшой веб-сервер (бутылка + официантка), который запускает браузер (основанный на встроенной структуре хрома) благодаря вызову подпроцесса.

Браузер - это файл приложения и работает нормально при запуске из gui.

Я запускать это так:

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

К сожалению, это не удается с OSError: permission denied.

Я попытался запустить сценарий с sudo с похожим результатом.

Я могу запустить приложение из оболочки с помощью следующей команды:

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. 

Любая идея, как решить эту проблему ?

+0

'os.getcwd() + 'cef/cefclient.app'' выглядит не так. Для меня 'getcwd()' не добавляет конечную косую черту. Возможно, вам повезло с 'os.path.join (os.getcwd(), 'cef/cefclient.app')' – vicvicvic

+0

Вы абсолютно уверены, что вам нужна -a после открытия? Я считаю, что вам нужно только это, если вы пытаетесь «открыть» документ и должны указать имя приложения, с которым можно открыть этот документ. – zzzirk

+0

Вправо/отсутствует после getcwd. Во всяком случае, команда все равно не работает – luc

ответ

5

Файл 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"]) 
+1

Использование пути «open -a» «[arguments to app]» должно работать. Например. 'open -a/Applications/Google \ Chrome.app http: // www.google.com' открывает Google в моей сессии Chrome. В вашем решении будет запущен другой экземпляр приложения - это то, чего вы обычно не делали в OS X. – vicvicvic

+0

Таким образом, это должно быть «Popen (['open', '- a', 'cef/cefclient.app', '--args', '- url-http: //127.0.0.1: 8100']) '? – Useless

+0

Да, это работает для меня. 'subprocess.Popen (['open', '-a',"/Applications/Google Chrome.app "])' работает для меня (выше, http://google.com был «файлом», который был открыт открыть с Google Chrome, а не аргумент, переданный в Chrome) – vicvicvic

1

В качестве альтернативы,

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

Просто зависит, если вы хотите контролировать STDIN/STDOUT или запуска приложения достаточно.

Смежные вопросы