2009-11-10 4 views
0

Я отлаживаю сервис, который я разрабатываю, который в основном откроет мой .app и передаст ему некоторые данные в stdin. Но это не похоже, что можно что-то вроде:Mac OS X app/service и stdin?

open -a myapp.app < foo_in.txt 

Можно ли передать материал в стандартный ввод в .app не давал вообще?

Редактировать: Извините, я должен был опубликовать это на SO и был более понятным. То, что я пытаюсь сделать, это то, что у меня есть приложение, созданное в Python + py2app. Я хочу иметь возможность обрабатывать как при удалении файла пользователем, так и в качестве службы. Первый случай не является проблемой, поскольку py2app имеет argv_emulation. Я просто проверяю, является ли первым аргументом путь.

Но чтение из stdin не работает вообще, оно не считывает никаких данных, независимо от того, выполняю ли я в качестве примера выше или его трубку. Если я передаю данные stdin в фактический основной скрипт python, он работает. Поэтому я перефразирую свой вопрос, можно ли читать с stdin с помощью пакета py2app?

+0

Переполнение стека? –

+0

(И мне интересно, не вышла ли следующая командная строка в 'open', а не в' myapp.app'?) – Arjan

ответ

1

Что вы имеете в виду, используя это как услугу?

Пример, который вы покажете, не будет работать, команда open вызывает запуск LaunchServices для запуска приложения, и в API-интерфейсе LaunchServices нет места для передачи данных stdin или аналогичных приложений.

Если вы хотите добавить товар в меню OS X Services, вы должны посмотреть на introductory documentation for developers.

+0

Спасибо, да, я имел в виду меню Services, и именно этого я и искал. Мне нужно будет исследовать, возможно ли создание службы таким образом с помощью py2app. – pojo

0

Ну

open -a /Applications/myapp.app < foo_in.txt 

откроет foo_in.txt в приложении myapp.app. Вам нужен полный путь приложения, будь то приложения, bin или где бы то ни было ...

Это зависит от того, что делает ваше приложение. Это может быть более подходящим:

cat foo_in.txt | your_command_goes_here 

Это будет читать содержимое foo_in.txt (с кошкой), и передать их в стандартный ввод (с трубой), так, то вы просто следовать, что с помощью команды/приложения.

+0

Вы попробовали? Или вы имеете в виду, что * откроет ** содержимое ** foo_in.txt в вашем приложении myapp.app *? – Arjan

+1

Команда open откроет файл в приложении в графическом интерфейсе. Второй пример передает содержимое в stdin. Тот же эффект можно было бы использовать с вашим_command_goes_here ridogi

+0

Итак, ** содержимое ** это действительно так. Тем не менее: вы попробовали это? По-видимому, опросчик попробовал то же самое (конечно, приложение открылось для вопросщика, но оно каким-то образом не попало в содержимое этого файла). – Arjan

0

Для запуска Finder как корень, один будет не использование:

sudo open -a /System/Library/CoreServices/Finder.app

Вышеприведенные работает open как корень, но по-прежнему работает open Finder как обычный пользователь. Вместо этого один бы use:

sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder

Итак, после этого, может быть (я действительно только гадать) нужно:

myapp.app/Contents/MacOS/myapp < foo_in.txt
+0

myapp.app/Contents/MacOS/myapp - это не команда unix, а просто путь. Я думаю, что оригинальный плакат пытается передать стандартную команду. Если они пытаются передать стандартное приложение GUI, которое будет включать Apple Script. – ridogi

+0

Ты меня теряешь. 'myapp.app/Contents/MacOS/myapp' в моем примере - это такая же команда (исполняемый файл), как« Finder.app/Contents/MacOS/Finder »(как определено как исполняемый файл в' info.plist пакета)). – Arjan

+0

Мое плохое, вы правы, что это не просто путь, но я не думаю, что можно передать stdin в исполняемый файл приложения GUI, хотя это можно сделать с помощью Apple Script, как я уже сказал. – ridogi

0

Вы почти наверняка будет делать это через порты Маха или Distributed Объекты или практически любой другой способ обмена данными между приложениями, предоставляемый ОС.

0

open создает совершенно новый процесс. Поэтому не используйте его для перенаправления материалов в приложение из терминала. Вы можете попробовать

./Foo.app/Contents/MacOS/Foo < Foo.txt 

cat Foo.txt | ./Foo.app/Contents/MacOS/Foo Уже упоминавшийся очень в зависимости от того, установлен ли Foo, как execurtbale и это на своем пути. В вашем случае я проверил бы пакет .app для папки Ressources, которая может содержать другой двоичный файл. A * .app Package - это каталог. Он не может обрабатывать аргументы командной строки.