Home | History | Annotate | Download | only in plat-mac
      1 """terminalcommand.py -- A minimal interface to Terminal.app.
      2 
      3 To run a shell command in a new Terminal.app window:
      4 
      5     import terminalcommand
      6     terminalcommand.run("ls -l")
      7 
      8 No result is returned; it is purely meant as a quick way to run a script
      9 with a decent input/output window.
     10 """
     11 
     12 #
     13 # This module is a fairly straightforward translation of Jack Jansen's
     14 # Mac/OSX/PythonLauncher/doscript.m.
     15 #
     16 
     17 from warnings import warnpy3k
     18 warnpy3k("In 3.x, the terminalcommand module is removed.", stacklevel=2)
     19 
     20 import time
     21 import os
     22 from Carbon import AE
     23 from Carbon.AppleEvents import *
     24 
     25 
     26 TERMINAL_SIG = "trmx"
     27 START_TERMINAL = "/usr/bin/open /Applications/Utilities/Terminal.app"
     28 SEND_MODE = kAENoReply  # kAEWaitReply hangs when run from Terminal.app itself
     29 
     30 
     31 def run(command):
     32     """Run a shell command in a new Terminal.app window."""
     33     termAddress = AE.AECreateDesc(typeApplicationBundleID, "com.apple.Terminal")
     34     theEvent = AE.AECreateAppleEvent(kAECoreSuite, kAEDoScript, termAddress,
     35                                      kAutoGenerateReturnID, kAnyTransactionID)
     36     commandDesc = AE.AECreateDesc(typeChar, command)
     37     theEvent.AEPutParamDesc(kAECommandClass, commandDesc)
     38 
     39     try:
     40         theEvent.AESend(SEND_MODE, kAENormalPriority, kAEDefaultTimeout)
     41     except AE.Error, why:
     42         if why[0] != -600:  # Terminal.app not yet running
     43             raise
     44         os.system(START_TERMINAL)
     45         time.sleep(1)
     46         theEvent.AESend(SEND_MODE, kAENormalPriority, kAEDefaultTimeout)
     47 
     48 
     49 if __name__ == "__main__":
     50     run("ls -l")
     51