Saltar al contenido

Cómo abrir programas externos en Python

Posteriormente a consultar expertos en la materia, programadores de varias ramas y maestros dimos con la solución a la pregunta y la compartimos en este post.

Solución:

La respuesta corta es que os.system no sabe donde encontrar firefox.exe.

Una posible solución sería utilizar la ruta completa. Y se recomienda utilizar el subprocess módulo:

import subprocess

subprocess.call(['C:Program FilesMozilla Firefox\firefox.exe'])

Cuidado con el \ antes de firefox.exe! Si usaras f, Python interpretaría esto como un formulario:

>>> print('C:Program FilesMozilla Firefoxfirefox.exe')
C:Program FilesMozilla Firefox
                                irefox.exe

Y, por supuesto, ese camino no existe. 🙂

Así que escapa de la barra invertida o usa un 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

Tenga en cuenta que el uso os.system o subprocess.call detendrá la aplicación actual hasta que finalice el programa que se inició. Entonces es posible que desee usar subprocess.Popen en lugar de. Eso lanzará el programa externo y luego continuará el script.

subprocess.Popen(['C:Program FilesMozilla Firefox\firefox.exe', '-new-tab'])

Esto abrirá Firefox (o creará una nueva pestaña en una instancia en ejecución).


Un ejemplo más completo es mi open utilidad que publico a través de github. Esto usa expresiones regulares para hacer coincidir las extensiones de archivo con los programas con los que abrir esos archivos. Entonces usa subprocess.Popen para abrir esos archivos en un programa apropiado. Como referencia, añado el código completo de la versión actual a continuación.

Tenga en cuenta que este programa fue escrito con sistemas operativos similares a UNIX en mente. En ms-windows probablemente podría obtener una aplicación para un tipo de archivo del registro.

"""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 = epub)$': ['mupdf'],
    '.html$': ['chrome', '--incognito'],
    '.xcf$': ['gimp'],
    '.e?ps$': ['gv'],
    '.(jpe?g
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)

Reseñas y valoraciones del tutorial

Si te gustó nuestro trabajo, puedes dejar un enunciado acerca de qué te ha parecido esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *