2009-11-10 6 views
0

Je suis en train de déboguer un service que je suis en train de développer, ce qui va essentiellement ouvrir mon .app et lui transmettre des données à stdin. Mais il ne semble pas qu'il est possible de quelque chose comme:Application/service Mac OS X et stdin?

open -a myapp.app < foo_in.txt 

Est-il possible de passer des choses au stdin d'un .app du tout?

Modifier: Désolé, je devrais avoir posté ceci sur SO et été plus clair. Ce que j'essaie de faire, c'est que j'ai une application faite en Python + py2app. Je veux être en mesure de gérer à la fois lorsqu'un utilisateur supprime un fichier et l'utilise en tant que service. Le premier cas n'est pas un problème puisque py2app a argv_emulation. Je vérifie juste si le premier argument est un chemin.

Mais lire depuis stdin ne fonctionne pas du tout, il ne lit pas de données, que je fasse comme dans l'exemple ci-dessus ou que je le canalise. Si je transmets des données stdin au script principal de Python, cela fonctionne. Donc, je reformule ma question, est-il possible de lire stdin avec un bundle py2app?

+0

Dépassement de pile? –

+0

(Et je me demande si la ligne de commande ci-dessus ne redirigerait pas dans 'open' plutôt que dans' myapp.app'?) – Arjan

Répondre

1

Qu'entendez-vous par l'utiliser en tant que service?

L'exemple que vous montrez ne fonctionnera pas, la commande open appelle LaunchServices pour lancer l'application et il n'y a pas de place dans l'API LaunchServices pour transmettre des données stdin ou similaires à l'application.

Si vous voulez ajouter un élément au menu OS X Services, vous devez consulter le introductory documentation for developers.

+0

Merci, oui je voulais dire le menu Services et c'était ce que je cherchais. Je vais devoir étudier si développer un service de cette façon est possible avec py2app. – pojo

0

Eh bien,

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

ouvrira foo_in.txt dans votre application myapp.app. Vous avez besoin du chemin d'accès complet de l'application, que ce soit Applications, bin ou n'importe où ...

Cela dépend de ce que fait votre application. Cela peut être plus approprié:

cat foo_in.txt | your_command_goes_here 

qui lit le contenu de foo_in.txt (avec chat) et de les transmettre à stdin (avec le tuyau), alors vous suivez juste que votre commande/application.

+0

Avez-vous essayé? Ou voulez-vous dire * ouvrira ** le contenu de ** foo_in.txt dans votre application myapp.app *? – Arjan

+1

La commande ouvrir ouvrira un fichier dans une application de l'interface graphique. Le deuxième exemple transmet le contenu à stdin. Le même effet pourrait être obtenu avec your_command_goes_here ridogi

+0

Donc, ** contents ** c'est en effet. Encore: avez-vous essayé cela? Apparemment, le questionneur a essayé la même chose (l'application a ouvert pour l'auteur de la question, mais le contenu de ce fichier n'a pas été transmis). – Arjan

0

Pour démarrer Finder en tant que root, on ne pas utilisation:

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

Les pistes ci-dessus open en tant que root, mais toujours open fonctionne Finder en tant qu'utilisateur normal. Au lieu de cela, on pourrait use:

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

Donc, après cela, peut-être (je suis vraiment juste deviner) il faut:

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

myapp.app/Contents/MacOS/myapp n'est pas une commande unix, juste un chemin. Je pense que l'affiche originale essaye de passer la norme à leur commande. S'ils essaient de passer standard dans une application graphique qui impliquera Apple Script. – ridogi

+0

Vous me perdez. 'myapp.app/Contents/MacOS/myapp' dans mon exemple est autant une commande (un exécutable) que' Finder.app/Contents/MacOS/Finder' (comme défini comme fichier exécutable dans le 'info.plist 'du paquet)). – Arjan

+0

Mon mauvais, vous avez raison, ce n'est pas juste un chemin, mais je ne pense pas qu'il soit possible de passer stdin à l'exécutable d'une application graphique, bien que cela puisse être fait avec Apple Script comme je l'ai dit. – ridogi

0

Vous devriez certainement faire cela à travers les ports de Mach ou distribués Objets ou à peu près n'importe quelle autre méthode de communication interapplication que le système d'exploitation met à votre disposition.

0

open crée un processus entièrement nouveau. Par conséquent, ne l'utilisez pas pour rediriger des éléments dans une application à partir du terminal. Vous pouvez essayer

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

déjà mentionné cat Foo.txt | ./Foo.app/Contents/MacOS/Foo très bien selon que vous définissez comme Foo execurtbale et il est dans votre chemin. Dans votre cas, je vérifierais le paquet .app pour un dossier Ressources, qui peut contenir un autre binaire. Un * .app Package est un répertoire. Il ne peut pas gérer les arguments de la ligne de commande.