How to open external programs in Python
Question:
Duplicate edit: no, i did that but it doesnt want to launch firefox.
I am making a cortana/siri assistant thing, and I want it to lets say open a web browser when I say something. So I have done the if part, but I just need it to launch firefox.exe I have tried different things and I get an error . Here is the code. Please help! It works with opening notepad but not firefox..
#subprocess.Popen(['C:Program FilesMozilla Firefoxfirefox.exe']) opens the app and continues the script
#subprocess.call(['C:Program FilesMozilla Firefoxfirefox.exe']) this opens it but doesnt continue the script
import os
import subprocess
print "Hello, I am Danbot.. If you are new ask for help!" #intro
prompt = ">" #sets the bit that indicates to input to >
input = raw_input (prompt) #sets whatever you say to the input so bot can proces
raw_input (prompt) #makes an input
if input == "help": #if the input is that
print "*****************************************************************" #says that
print "I am only being created.. more feautrues coming soon!" #says that
print "*****************************************************************" #says that
print "What is your name talks about names" #says that
print "Open (name of program) opens an application" #says that
print "sometimes a command is ignored.. restart me then!"
print "Also, once you type in a command, press enter a couple of times.."
print "*****************************************************************" #says that
raw_input (prompt) #makes an input
if input == "open notepad": #if the input is that
print "opening notepad!!" #says that
print os.system('notepad.exe') #starts notepad
if input == "open the internet": #if the input is that
print "opening firefox!!" #says that
subprocess.Popen(['C:Program FilesMozilla Firefoxfirefox.exe'])
Answers:
The short answer is that os.system
doesn’t know where to find firefox.exe
.
A possible solution would be to use the full path. And it is recommended to use the subprocess
module:
import subprocess
subprocess.call(['C:Program FilesMozilla Firefox\firefox.exe'])
Mind the \
before the firefox.exe
! If you’d use f
, Python would interpret this as a formfeed:
>>> print('C:Program FilesMozilla Firefoxfirefox.exe')
C:Program FilesMozilla Firefox
irefox.exe
And of course that path doesn’t exist. 🙂
So either escape the backslash or use a raw string:
>>> print('C:Program FilesMozilla Firefox\firefox.exe')
C:Program FilesMozilla Firefoxfirefox.exe
>>> print(r'C:Program FilesMozilla Firefoxfirefox.exe')
C:Program FilesMozilla Firefoxfirefox.exe
Note that using os.system
or subprocess.call
will stop the current application until the program that is started finishes. So you might want to use subprocess.Popen
instead. That will launch the external program and then continue the script.
subprocess.Popen(['C:Program FilesMozilla Firefox\firefox.exe', '-new-tab'])
This will open firefox (or create a new tab in a running instance).
A more complete example is my open
utility I publish via github. This uses regular expressions to match file extensions to programs to open those files with. Then it uses subprocess.Popen
to open those files in an appropriate program. For reference I’m adding the complete code for the current version below.
Note that this program was written with UNIX-like operating systems in mind. On ms-windows you could probably get an application for a filetype from the registry.
"""Opens the file(s) given on the command line in the appropriate program.
Some of the programs are X11 programs."""
from os.path import isdir, isfile
from re import search, IGNORECASE
from subprocess import Popen, check_output, CalledProcessError
from sys import argv
import argparse
import logging
__version__ = '1.3.0'
# You should adjust the programs called to suit your preferences.
filetypes = {
'.(pdf|epub)$': ['mupdf'],
'.html$': ['chrome', '--incognito'],
'.xcf$': ['gimp'],
'.e?ps$': ['gv'],
'.(jpe?g|png|gif|tiff?|p[abgp]m|svg)$': ['gpicview'],
'.(pax|cpio|zip|jar|ar|xar|rpm|7z)$': ['tar', 'tf'],
'.(tar.|t)(z|gz|bz2?|xz)$': ['tar', 'tf'],
'.(mp4|mkv|avi|flv|mpg|movi?|m4v|webm)$': ['mpv']
}
othertypes = {'dir': ['rox'], 'txt': ['gvim', '--nofork']}
def main(argv):
"""Entry point for this script.
Arguments:
argv: command line arguments; list of strings.
"""
if argv[0].endswith(('open', 'open.py')):
del argv[0]
opts = argparse.ArgumentParser(prog='open', description=__doc__)
opts.add_argument('-v', '--version', action='version',
version=__version__)
opts.add_argument('-a', '--application', help='application to use')
opts.add_argument('--log', default='warning',
choices=['debug', 'info', 'warning', 'error'],
help="logging level (defaults to 'warning')")
opts.add_argument("files", metavar='file', nargs='*',
help="one or more files to process")
args = opts.parse_args(argv)
logging.basicConfig(level=getattr(logging, args.log.upper(), None),
format='%(levelname)s: %(message)s')
logging.info('command line arguments = {}'.format(argv))
logging.info('parsed arguments = {}'.format(args))
fail = "opening '{}' failed: {}"
for nm in args.files:
logging.info("Trying '{}'".format(nm))
if not args.application:
if isdir(nm):
cmds = othertypes['dir'] + [nm]
elif isfile(nm):
cmds = matchfile(filetypes, othertypes, nm)
else:
cmds = None
else:
cmds = [args.application, nm]
if not cmds:
logging.warning("do not know how to open '{}'".format(nm))
continue
try:
Popen(cmds)
except OSError as e:
logging.error(fail.format(nm, e))
else: # No files named
if args.application:
try:
Popen([args.application])
except OSError as e:
logging.error(fail.format(args.application, e))
def matchfile(fdict, odict, fname):
"""For the given filename, returns the matching program. It uses the `file`
utility commonly available on UNIX.
Arguments:
fdict: Handlers for files. A dictionary of regex:(commands)
representing the file type and the action that is to be taken for
opening one.
odict: Handlers for other types. A dictionary of str:(arguments).
fname: A string containing the name of the file to be opened.
Returns: A list of commands for subprocess.Popen.
"""
for k, v in fdict.items():
if search(k, fname, IGNORECASE) is not None:
return v + [fname]
try:
if b'text' in check_output(['file', fname]):
return odict['txt'] + [fname]
except CalledProcessError:
logging.warning("the command 'file {}' failed.".format(fname))
return None
if __name__ == '__main__':
main(argv)
If you want to open Google or something on the web just import webbrowser
and open the URL. I will give you a quick example.
import webbrowser
webbrowser.open("www.google.com")
You can open any program like this:
import subprocess
# This will pause the script until fortnite is closed
subprocess.call(['C:Program FilesFortnitefortnite.exe'])
# But this will run fortnite and continue the script
subprocess.Popen(['C:Program FilesFortnitefortnite.exe', '-new-tab'])
But here’s How to find the .exe file of any program (Windows only)
I only know how to find the .exe
file in windows
First, click the windows icon then write task manager, open it, then find Fortnite if there’s an arrow on it’s left click it, if there’s another one click it.
Make sure that you press the More Details button at the bottom.
Then scroll to the side until you find Command line written on the top row, here there will be the path of the .exe file of every running task
There might be -(SOME_LETTER) but these are some options for choosing what the exe file will do when it’s ran. These are different for every exe file
(Little tips)
You can press Ctrl+Shift+Esc to open the task manager.
Go in the task manager then press Options (at the top) then press Always on top, which will make the app appear on top of every thing which is pretty useful when an app crashes and you need to close it using the task manager
Thanks.
Welcome to 2022!
You can simply make use of PYPI module AppOpener.
# pip install AppOpener
from AppOpener import run
run("whatsapp") #Opens whatsapp if installed
run("whatsapp, telegram") # Opens whatsapp & telegram
Visit AppOpener’s documentation here.
Running it in loop
from AppOpener import run
# infinite loop
while True:
# take user input
inp = input("ENTER APPLICATION TO OPEN: ").strip()
if inp:
run(inp)
Duplicate edit: no, i did that but it doesnt want to launch firefox.
I am making a cortana/siri assistant thing, and I want it to lets say open a web browser when I say something. So I have done the if part, but I just need it to launch firefox.exe I have tried different things and I get an error . Here is the code. Please help! It works with opening notepad but not firefox..
#subprocess.Popen(['C:Program FilesMozilla Firefoxfirefox.exe']) opens the app and continues the script
#subprocess.call(['C:Program FilesMozilla Firefoxfirefox.exe']) this opens it but doesnt continue the script
import os
import subprocess
print "Hello, I am Danbot.. If you are new ask for help!" #intro
prompt = ">" #sets the bit that indicates to input to >
input = raw_input (prompt) #sets whatever you say to the input so bot can proces
raw_input (prompt) #makes an input
if input == "help": #if the input is that
print "*****************************************************************" #says that
print "I am only being created.. more feautrues coming soon!" #says that
print "*****************************************************************" #says that
print "What is your name talks about names" #says that
print "Open (name of program) opens an application" #says that
print "sometimes a command is ignored.. restart me then!"
print "Also, once you type in a command, press enter a couple of times.."
print "*****************************************************************" #says that
raw_input (prompt) #makes an input
if input == "open notepad": #if the input is that
print "opening notepad!!" #says that
print os.system('notepad.exe') #starts notepad
if input == "open the internet": #if the input is that
print "opening firefox!!" #says that
subprocess.Popen(['C:Program FilesMozilla Firefoxfirefox.exe'])
The short answer is that os.system
doesn’t know where to find firefox.exe
.
A possible solution would be to use the full path. And it is recommended to use the subprocess
module:
import subprocess
subprocess.call(['C:Program FilesMozilla Firefox\firefox.exe'])
Mind the \
before the firefox.exe
! If you’d use f
, Python would interpret this as a formfeed:
>>> print('C:Program FilesMozilla Firefoxfirefox.exe')
C:Program FilesMozilla Firefox
irefox.exe
And of course that path doesn’t exist. 🙂
So either escape the backslash or use a raw string:
>>> print('C:Program FilesMozilla Firefox\firefox.exe')
C:Program FilesMozilla Firefoxfirefox.exe
>>> print(r'C:Program FilesMozilla Firefoxfirefox.exe')
C:Program FilesMozilla Firefoxfirefox.exe
Note that using os.system
or subprocess.call
will stop the current application until the program that is started finishes. So you might want to use subprocess.Popen
instead. That will launch the external program and then continue the script.
subprocess.Popen(['C:Program FilesMozilla Firefox\firefox.exe', '-new-tab'])
This will open firefox (or create a new tab in a running instance).
A more complete example is my open
utility I publish via github. This uses regular expressions to match file extensions to programs to open those files with. Then it uses subprocess.Popen
to open those files in an appropriate program. For reference I’m adding the complete code for the current version below.
Note that this program was written with UNIX-like operating systems in mind. On ms-windows you could probably get an application for a filetype from the registry.
"""Opens the file(s) given on the command line in the appropriate program.
Some of the programs are X11 programs."""
from os.path import isdir, isfile
from re import search, IGNORECASE
from subprocess import Popen, check_output, CalledProcessError
from sys import argv
import argparse
import logging
__version__ = '1.3.0'
# You should adjust the programs called to suit your preferences.
filetypes = {
'.(pdf|epub)$': ['mupdf'],
'.html$': ['chrome', '--incognito'],
'.xcf$': ['gimp'],
'.e?ps$': ['gv'],
'.(jpe?g|png|gif|tiff?|p[abgp]m|svg)$': ['gpicview'],
'.(pax|cpio|zip|jar|ar|xar|rpm|7z)$': ['tar', 'tf'],
'.(tar.|t)(z|gz|bz2?|xz)$': ['tar', 'tf'],
'.(mp4|mkv|avi|flv|mpg|movi?|m4v|webm)$': ['mpv']
}
othertypes = {'dir': ['rox'], 'txt': ['gvim', '--nofork']}
def main(argv):
"""Entry point for this script.
Arguments:
argv: command line arguments; list of strings.
"""
if argv[0].endswith(('open', 'open.py')):
del argv[0]
opts = argparse.ArgumentParser(prog='open', description=__doc__)
opts.add_argument('-v', '--version', action='version',
version=__version__)
opts.add_argument('-a', '--application', help='application to use')
opts.add_argument('--log', default='warning',
choices=['debug', 'info', 'warning', 'error'],
help="logging level (defaults to 'warning')")
opts.add_argument("files", metavar='file', nargs='*',
help="one or more files to process")
args = opts.parse_args(argv)
logging.basicConfig(level=getattr(logging, args.log.upper(), None),
format='%(levelname)s: %(message)s')
logging.info('command line arguments = {}'.format(argv))
logging.info('parsed arguments = {}'.format(args))
fail = "opening '{}' failed: {}"
for nm in args.files:
logging.info("Trying '{}'".format(nm))
if not args.application:
if isdir(nm):
cmds = othertypes['dir'] + [nm]
elif isfile(nm):
cmds = matchfile(filetypes, othertypes, nm)
else:
cmds = None
else:
cmds = [args.application, nm]
if not cmds:
logging.warning("do not know how to open '{}'".format(nm))
continue
try:
Popen(cmds)
except OSError as e:
logging.error(fail.format(nm, e))
else: # No files named
if args.application:
try:
Popen([args.application])
except OSError as e:
logging.error(fail.format(args.application, e))
def matchfile(fdict, odict, fname):
"""For the given filename, returns the matching program. It uses the `file`
utility commonly available on UNIX.
Arguments:
fdict: Handlers for files. A dictionary of regex:(commands)
representing the file type and the action that is to be taken for
opening one.
odict: Handlers for other types. A dictionary of str:(arguments).
fname: A string containing the name of the file to be opened.
Returns: A list of commands for subprocess.Popen.
"""
for k, v in fdict.items():
if search(k, fname, IGNORECASE) is not None:
return v + [fname]
try:
if b'text' in check_output(['file', fname]):
return odict['txt'] + [fname]
except CalledProcessError:
logging.warning("the command 'file {}' failed.".format(fname))
return None
if __name__ == '__main__':
main(argv)
If you want to open Google or something on the web just import webbrowser
and open the URL. I will give you a quick example.
import webbrowser
webbrowser.open("www.google.com")
You can open any program like this:
import subprocess
# This will pause the script until fortnite is closed
subprocess.call(['C:Program FilesFortnitefortnite.exe'])
# But this will run fortnite and continue the script
subprocess.Popen(['C:Program FilesFortnitefortnite.exe', '-new-tab'])
But here’s How to find the .exe file of any program (Windows only)
I only know how to find the .exe
file in windows
First, click the windows icon then write task manager, open it, then find Fortnite if there’s an arrow on it’s left click it, if there’s another one click it.
Make sure that you press the More Details button at the bottom.
Then scroll to the side until you find Command line written on the top row, here there will be the path of the .exe file of every running task
There might be -(SOME_LETTER) but these are some options for choosing what the exe file will do when it’s ran. These are different for every exe file
(Little tips)
You can press Ctrl+Shift+Esc to open the task manager.
Go in the task manager then press Options (at the top) then press Always on top, which will make the app appear on top of every thing which is pretty useful when an app crashes and you need to close it using the task manager
Thanks.
Welcome to 2022!
You can simply make use of PYPI module AppOpener.
# pip install AppOpener
from AppOpener import run
run("whatsapp") #Opens whatsapp if installed
run("whatsapp, telegram") # Opens whatsapp & telegram
Visit AppOpener’s documentation here.
Running it in loop
from AppOpener import run
# infinite loop
while True:
# take user input
inp = input("ENTER APPLICATION TO OPEN: ").strip()
if inp:
run(inp)