Приложение / служба Mac OS X и стандартный ввод? - PullRequest
0 голосов
/ 10 ноября 2009

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

open -a myapp.app < foo_in.txt

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

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

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

Ответы [ 5 ]

1 голос
/ 11 ноября 2009

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

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

Если вы имеете в виду добавление элемента в меню служб OS X, вам следует ознакомиться с вводной документацией для разработчиков .

0 голосов
/ 11 ноября 2009

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

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

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

0 голосов
/ 11 ноября 2009

Чтобы запустить Finder от имени пользователя root, нужно , а не использовать:

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

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

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

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

myapp.app/Contents/MacOS/myapp < foo_in.txt
0 голосов
/ 11 ноября 2009

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

0 голосов
/ 10 ноября 2009

Ну,

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 (с помощью cat) и передавать его в stdin (с каналом), так что вы просто выполните это с помощью своей команды / приложения.

...