Launching an independent Python program in a cross-platform way (including mac)

Discussion in 'Python' started by =?iso-8859-1?B?QW5kcuk=?=, Apr 30, 2007.

  1. I would like to find out how I can launch an independent Python
    program from existing one in a cross-platform way. The result I am
    after is that a new terminal window should open (for io independent of
    the original script).

    The following seems to work correctly under Ubuntu and Windows ... but
    I haven't been able to find a way to make it work under Mac OS.

    def exec_external(code, path):
    """execute code in an external process
    currently works under:
    * Windows NT (tested)
    * GNOME (tested) [January 2nd and 15th change untested]
    This also needs to be implemented for OS X, KDE
    and some form of linux fallback (xterm?)
    """
    if os.name == 'nt':
    current_dir = os.getcwd()
    target_dir, fname = os.path.split(path)

    filename = open(path, 'w')
    filename.write(code)
    filename.close()

    if os.name == 'nt':
    os.chdir(target_dir) # change dir so as to deal with paths
    that
    # include spaces
    Popen(["cmd.exe", ('/c start python %s'%fname)])
    os.chdir(current_dir)
    elif os.name == 'posix':
    try:
    os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome-
    terminal',
    '-x', 'python', '%s'%path)
    except:
    raise NotImplementedError
    else:
    raise NotImplementedError
    ==========================
    Any help would be greatly appreciated.

    André
    =?iso-8859-1?B?QW5kcuk=?=, Apr 30, 2007
    #1
    1. Advertising

  2. On Apr 29, 8:32 pm, André <> wrote:
    > I would like to find out how I can launch an independent Python
    > program from existing one in a cross-platform way. The result I am
    > after is that a new terminal window should open (for io independent of
    > the original script).
    >
    > The following seems to work correctly under Ubuntu and Windows ... but
    > I haven't been able to find a way to make it work under Mac OS.
    >


    Forgot to add that there was an import as follows:

    import os # should have been obvious
    from subprocess import Popen # slightly less so


    > def exec_external(code, path):
    > """execute code in an external process
    > currently works under:
    > * Windows NT (tested)
    > * GNOME (tested) [January 2nd and 15th change untested]
    > This also needs to be implemented for OS X, KDE
    > and some form of linux fallback (xterm?)
    > """
    > if os.name == 'nt':
    > current_dir = os.getcwd()
    > target_dir, fname = os.path.split(path)
    >
    > filename = open(path, 'w')
    > filename.write(code)
    > filename.close()
    >
    > if os.name == 'nt':
    > os.chdir(target_dir) # change dir so as to deal with paths
    > that
    > # include spaces
    > Popen(["cmd.exe", ('/c start python %s'%fname)])
    > os.chdir(current_dir)
    > elif os.name == 'posix':
    > try:
    > os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome- terminal',
    > '-x', 'python', '%s'%path)
    > except:
    > raise NotImplementedError
    > else:
    > raise NotImplementedError
    > ==========================
    > Any help would be greatly appreciated.
    >
    > André
    =?iso-8859-1?B?QW5kcuk=?=, Apr 30, 2007
    #2
    1. Advertising

  3. =?iso-8859-1?B?QW5kcuk=?=

    Prateek Guest

    On Apr 30, 4:32 am, André <> wrote:
    > I would like to find out how I can launch an independent Python
    > program from existing one in a cross-platform way. The result I am
    > after is that a new terminal window should open (for io independent of
    > the original script).
    >
    > The following seems to work correctly under Ubuntu and Windows ... but
    > I haven't been able to find a way to make it work under Mac OS.
    >
    > def exec_external(code, path):
    > """execute code in an external process
    > currently works under:
    > * Windows NT (tested)
    > * GNOME (tested) [January 2nd and 15th change untested]
    > This also needs to be implemented for OS X, KDE
    > and some form of linux fallback (xterm?)
    > """
    > if os.name == 'nt':
    > current_dir = os.getcwd()
    > target_dir, fname = os.path.split(path)
    >
    > filename = open(path, 'w')
    > filename.write(code)
    > filename.close()
    >
    > if os.name == 'nt':
    > os.chdir(target_dir) # change dir so as to deal with paths
    > that
    > # include spaces
    > Popen(["cmd.exe", ('/c start python %s'%fname)])
    > os.chdir(current_dir)
    > elif os.name == 'posix':
    > try:
    > os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome-
    > terminal',
    > '-x', 'python', '%s'%path)
    > except:
    > raise NotImplementedError
    > else:
    > raise NotImplementedError
    > ==========================
    > Any help would be greatly appreciated.
    >
    > André


    Well,

    You need to check sys.platform on the Mac instead of os.name.
    os.name returns 'posix' on all *nix based systems. sys.platform
    helpfully returns "darwin" on the Mac.

    Not sure how to start Terminal. Here's what I got when I tried it:

    >>> if sys.platform == "darwin": os.spawnlp(os.P_NOWAIT, '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal')

    9460
    >>> 2007-04-30 05:19:59.255 [9460] No Info.plist file in application bundle or no NSPrincipalClass in the Info.plist file, exiting


    Maybe I'm just calling it wrong and you'll have more luck.

    Prateek
    Prateek, Apr 30, 2007
    #3
  4. =?iso-8859-1?B?QW5kcuk=?=

    Kevin Walzer Guest

    Re: Launching an independent Python program in a cross-platform way(including mac)

    Prateek wrote:
    > On Apr 30, 4:32 am, André <> wrote:
    >> I would like to find out how I can launch an independent Python
    >> program from existing one in a cross-platform way. The result I am
    >> after is that a new terminal window should open (for io independent of
    >> the original script).
    >>
    >> The following seems to work correctly under Ubuntu and Windows ... but
    >> I haven't been able to find a way to make it work under Mac OS.
    >>
    >> def exec_external(code, path):
    >> """execute code in an external process
    >> currently works under:
    >> * Windows NT (tested)
    >> * GNOME (tested) [January 2nd and 15th change untested]
    >> This also needs to be implemented for OS X, KDE
    >> and some form of linux fallback (xterm?)
    >> """
    >> if os.name == 'nt':
    >> current_dir = os.getcwd()
    >> target_dir, fname = os.path.split(path)
    >>
    >> filename = open(path, 'w')
    >> filename.write(code)
    >> filename.close()
    >>
    >> if os.name == 'nt':
    >> os.chdir(target_dir) # change dir so as to deal with paths
    >> that
    >> # include spaces
    >> Popen(["cmd.exe", ('/c start python %s'%fname)])
    >> os.chdir(current_dir)
    >> elif os.name == 'posix':
    >> try:
    >> os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome-
    >> terminal',
    >> '-x', 'python', '%s'%path)
    >> except:
    >> raise NotImplementedError
    >> else:
    >> raise NotImplementedError
    >> ==========================
    >> Any help would be greatly appreciated.
    >>
    >> André

    >
    > Well,
    >
    > You need to check sys.platform on the Mac instead of os.name.
    > os.name returns 'posix' on all *nix based systems. sys.platform
    > helpfully returns "darwin" on the Mac.
    >
    > Not sure how to start Terminal. Here's what I got when I tried it:
    >
    >>>> if sys.platform == "darwin": os.spawnlp(os.P_NOWAIT, '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal')

    > 9460
    >>>> 2007-04-30 05:19:59.255 [9460] No Info.plist file in application bundle or no NSPrincipalClass in the Info.plist file, exiting

    >


    There are extension modules on the Mac for integrating Python and
    AppleScript (the best one is appscript). However, if you want to limit
    yourself to core Python, your best best is osascript, a system
    command-tool that lets you call AppleScript code with arguments from
    other programs. This can be called via os.system.

    The basis syntax for doing this from Python might look something like this:

    os.system('osascript -e \'tell app \"Terminal\" to activate\'')

    This simply launches Terminal. Note that you have to deal with quoting
    issues. The equivalent syntax from AppleScript would be:

    tell app "Terminal" to activate

    If you want to Terminal to run a command-line program from AppleScript,
    you can do this with the "do script" command. Code to do this could look
    something like this:

    myscript = "python -e foo.py"
    os.system('osascript -e '\tell app \"Terminal"\ to do script %s\'',
    myscript)


    I haven't tested this, but you get the basic idea--define the script and
    command-line paramaters in a string, then pass that to
    AppleScript/osascript as a variable. This code should launch Terminal,
    then run the external Python script.

    HTH,
    Kevin

    --
    Kevin Walzer
    Code by Kevin
    http://www.codebykevin.com
    Kevin Walzer, Apr 30, 2007
    #4
  5. On Apr 30, 10:59 am, Kevin Walzer <> wrote:
    [snip]
    >
    > There are extension modules on the Mac for integrating Python and
    > AppleScript (the best one is appscript). However, if you want to limit
    > yourself to core Python, your best best is osascript, a system
    > command-tool that lets you call AppleScript code with arguments from
    > other programs. This can be called via os.system.
    >
    > The basis syntax for doing this from Python might look something like this:
    >
    > os.system('osascript -e \'tell app \"Terminal\" to activate\'')
    >
    > This simply launches Terminal. Note that you have to deal with quoting
    > issues. The equivalent syntax from AppleScript would be:
    >
    > tell app "Terminal" to activate
    >
    > If you want to Terminal to run a command-line program from AppleScript,
    > you can do this with the "do script" command. Code to do this could look
    > something like this:
    >
    > myscript = "python -e foo.py"
    > os.system('osascript -e '\tell app \"Terminal"\ to do script %s\'',
    > myscript)
    >
    > I haven't tested this, but you get the basic idea--define the script and
    > command-line paramaters in a string, then pass that to
    > AppleScript/osascript as a variable. This code should launch Terminal,
    > then run the external Python script.
    >
    > HTH,

    Thanks. I managed to get something like this to work. Later, I'll
    post it as an example to this thread so that other can use if for a
    reference if needed.

    André
    > Kevin
    >
    > --
    > Kevin Walzer
    > Code by Kevinhttp://www.codebykevin.com
    =?iso-8859-1?B?QW5kcuk=?=, Apr 30, 2007
    #5
  6. =?iso-8859-1?B?QW5kcuk=?=

    Guest

    I would like to see this as a command along with something to open web
    pages.. Just one command instead of trying to figure out all the
    different op systems. look forward to seeing your code

    https://sourceforge.net/projects/dex-tracker


    On Apr 30, 9:40 am, André <> wrote:
    > On Apr 30, 10:59 am, Kevin Walzer <> wrote:
    > [snip]
    >
    >
    >
    >
    >
    > > There are extension modules on the Mac for integrating Python and
    > > AppleScript (the best one is appscript). However, if you want to limit
    > > yourself to core Python, your best best is osascript, a system
    > > command-tool that lets you call AppleScript code with arguments from
    > > other programs. This can be called via os.system.

    >
    > > The basis syntax for doing this from Python might look something like this:

    >
    > > os.system('osascript -e \'tell app \"Terminal\" to activate\'')

    >
    > > This simply launches Terminal. Note that you have to deal with quoting
    > > issues. The equivalent syntax from AppleScript would be:

    >
    > > tell app "Terminal" to activate

    >
    > > If you want to Terminal to run a command-line program from AppleScript,
    > > you can do this with the "do script" command. Code to do this could look
    > > something like this:

    >
    > > myscript = "python -e foo.py"
    > > os.system('osascript -e '\tell app \"Terminal"\ to do script %s\'',
    > > myscript)

    >
    > > I haven't tested this, but you get the basic idea--define the script and
    > > command-line paramaters in a string, then pass that to
    > > AppleScript/osascript as a variable. This code should launch Terminal,
    > > then run the external Python script.

    >
    > > HTH,

    >
    > Thanks. I managed to get something like this to work. Later, I'll
    > post it as an example to this thread so that other can use if for a
    > reference if needed.
    >
    > André
    >
    >
    >
    > > Kevin

    >
    > > --
    > > Kevin Walzer
    > > Code by Kevinhttp://www.codebykevin.com- Hide quoted text -

    >
    > - Show quoted text -- Hide quoted text -
    >
    > - Show quoted text -
    , Apr 30, 2007
    #6
  7. =?iso-8859-1?B?QW5kcuk=?=

    Guest

    On Apr 30, 11:29 am, "" <>
    wrote:
    > I would like to see this as a command along with something to open web
    > pages.. Just one command instead of trying to figure out all the
    > different op systems. look forward to seeing your code
    >
    > https://sourceforge.net/projects/dex-tracker
    >
    > On Apr 30, 9:40 am, André <> wrote:
    >
    > > On Apr 30, 10:59 am, Kevin Walzer <> wrote:
    > > [snip]

    >
    > > > There are extension modules on the Mac for integrating Python and
    > > > AppleScript (the best one is appscript). However, if you want to limit
    > > > yourself to core Python, your best best is osascript, a system
    > > > command-tool that lets you call AppleScript code with arguments from
    > > > other programs. This can be called via os.system.

    >
    > > > The basis syntax for doing this from Python might look something like this:

    >
    > > > os.system('osascript -e \'tell app \"Terminal\" to activate\'')

    >
    > > > This simply launches Terminal. Note that you have to deal with quoting
    > > > issues. The equivalent syntax from AppleScript would be:

    >
    > > > tell app "Terminal" to activate

    >
    > > > If you want to Terminal to run a command-line program from AppleScript,
    > > > you can do this with the "do script" command. Code to do this could look
    > > > something like this:

    >
    > > > myscript = "python -e foo.py"
    > > > os.system('osascript -e '\tell app \"Terminal"\ to do script %s\'',
    > > > myscript)

    >
    > > > I haven't tested this, but you get the basic idea--define the script and
    > > > command-line paramaters in a string, then pass that to
    > > > AppleScript/osascript as a variable. This code should launch Terminal,
    > > > then run the external Python script.

    >
    > > > HTH,

    >
    > > Thanks. I managed to get something like this to work. Later, I'll
    > > post it as an example to this thread so that other can use if for a
    > > reference if needed.

    >
    > > André

    >
    > > > Kevin

    >
    > > > --
    > > > Kevin Walzer
    > > > Code by Kevinhttp://www.codebykevin.com-Hide quoted text -

    >
    > > - Show quoted text -- Hide quoted text -

    >
    > > - Show quoted text -


    Opening web pages cross-platform can be done with the "webbrowser"
    module: http://docs.python.org/lib/module-webbrowser.html

    Mike
    , Apr 30, 2007
    #7
  8. As promised, here's the solution I came up with for launching an
    external python script. The function below has been edited (read
    simplified slightly) from the original one used in Crunchy. Note that
    while the original has been tested, the following has not- but it
    should provide a good start *if* problems are found with it.

    André
    ====================
    def exec_external(path):
    """execute code saved in file found in 'path' in an external
    process
    currently works under:
    * Windows NT (tested)
    * GNOME
    * OS X
    This also needs to be tested for KDE
    and implemented some form of linux fallback (xterm?)
    """
    if os.name == 'nt':
    current_dir = os.getcwd()
    target_dir, fname = os.path.split(path)
    os.chdir(target_dir) # change dir so as to deal with paths
    that
    # include spaces
    if console:
    Popen(["cmd.exe", ('/c start python %s'%fname)])
    else:
    Popen(["cmd.exe", ('/c python %s'%fname)])
    os.chdir(current_dir)
    elif sys.platform == 'darwin':
    pth, fn = os.path.split(path)
    activate = 'tell application "Terminal" to activate'
    script = r"cd '\''/Users/andre/CrunchySVN/branches/
    andre'\'';python '\''test.py'\'';exit"
    do_script = r'tell application "Terminal" to do script
    "%s"'%script
    command = "osascript -e '%s';osascript -e '%s'"%(activate,
    do_script)
    os.popen(command)
    elif os.name == 'posix':
    try:
    os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome-
    terminal',
    '-x', 'python', '%s'%path)
    except:
    try: # untested
    os.spawnlp(os.P_NOWAIT, 'konsole', 'konsole',
    '-x', 'python', '%s'%path)
    except:
    raise NotImplementedError
    else:
    raise NotImplementedError
    =?iso-8859-1?B?QW5kcuk=?=, May 1, 2007
    #8
  9. My apologies about the last post; I posted my "test" code by mistake,
    with hard-coded path information. Here's for future reference
    something that is general and should work cross-platform.
    André

    def exec_external(code=None, path=None):
    """execute code in an external process
    currently works under:
    * Windows NT (tested)
    * GNOME
    * OS X
    This also needs to be tested for KDE
    and implemented some form of linux fallback (xterm?)
    """
    if path is None:
    path = os.path.join(os.path.expanduser("~"), "temp.py")
    if os.name == 'nt' or sys.platform == 'darwin':
    current_dir = os.getcwd()
    target_dir, fname = os.path.split(path)

    if code is not None:
    filename = open(path, 'w')
    filename.write(code)
    filename.close()

    if os.name == 'nt':
    os.chdir(target_dir) # change dir so as to deal with paths
    that
    # include spaces
    Popen(["cmd.exe", ('/c start python %s'%fname)])
    os.chdir(current_dir)
    elif sys.platform == 'darwin': # a much more general method can
    be found
    # in SPE, Stani's Python Editor -
    Child.py
    activate = 'tell application "Terminal" to activate'
    script = r"cd '\''%s'\'';python '\''%s'\'';exit"%(target_dir,
    fname)
    do_script = r'tell application "Terminal" to do script
    "%s"'%script
    command = "osascript -e '%s';osascript -e '%s'"%(activate,
    do_script)
    os.popen(command)
    elif os.name == 'posix':
    try:
    os.spawnlp(os.P_NOWAIT, 'gnome-terminal', 'gnome-
    terminal',
    '-x', 'python', '%s'%path)
    except:
    try: # untested
    os.spawnlp(os.P_NOWAIT, 'konsole', 'konsole',
    '-x', 'python', '%s'%path)
    except:
    raise NotImplementedError
    else:
    raise NotImplementedError
    =?iso-8859-1?B?QW5kcuk=?=, May 1, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Coca
    Replies:
    15
    Views:
    625
    Alan Balmer
    Jan 14, 2004
  2. MK
    Replies:
    1
    Views:
    819
    Peter Hansen
    Jun 25, 2003
  3. Gandalf
    Replies:
    1
    Views:
    291
    Lawrence Oluyede
    Aug 18, 2004
  4. Jan Thomä
    Replies:
    15
    Views:
    2,485
    Jan Thomä
    Feb 19, 2009
  5. Daniel Fetchinson
    Replies:
    49
    Views:
    1,322
    alex23
    Aug 6, 2010
Loading...

Share This Page