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

  • Thread starter =?iso-8859-1?B?QW5kcuk=?=
  • Start date
?

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

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=?=

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é
 
P

Prateek

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
 
K

Kevin Walzer

Prateek said:
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
 
?

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

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é
 
E

Eric_Dexter

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


[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.

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é



- Show quoted text -- Hide quoted text -

- Show quoted text -
 
K

kyosohma

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

[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.
- 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
 
?

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

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=?=

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,708
Latest member
SherleneF1

Latest Threads

Top