software powered instalar developing python windows macos

powered - Documento abierto con la aplicación predeterminada en Python



python powered (13)

Necesito poder abrir un documento usando su aplicación predeterminada en Windows y Mac OS. Básicamente, quiero hacer lo mismo que sucede cuando haces doble clic en el icono del documento en el Explorador o en el Buscador. ¿Cuál es la mejor manera de hacer esto en Python?


En Mac OS, puede usar el comando "abrir". Hay una llamada a la API de Windows que hace algo similar, pero no lo recuerdo de improviso.

Actualizar

De acuerdo, el comando "iniciar" lo hará, así que esto debería funcionar.

Mac OS X:

os.system("open "+filename)

Windows:

os.system("start "+filename)

Mucho más tarde, la actualización de Edward: os.system funciona, pero solo funciona con nombres de archivos que no tienen ningún espacio en las carpetas y archivos en el nombre del archivo (por ejemplo, A: / abc / def / a.txt) .

Actualización posterior

Bien, claramente esta controversia tonta continúa, así que solo veamos hacer esto con un subproceso.

open y start son cosas de intérprete de comandos para Mac OS / X y Windows, respectivamente. Ahora, digamos que usamos un subproceso. Canónicamente, usarías:

try: retcode = subprocess.call("open " + filename, shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e

Ahora, ¿cuáles son las ventajas de esto? En teoría, esto es más seguro, pero de hecho, necesitamos ejecutar una línea de comando de una forma u otra; en cualquier ambiente, necesitamos que el ambiente y los servicios interfieran, obtengan caminos, y así sucesivamente. En ninguno de los casos estamos ejecutando texto arbitrario, por lo que no tiene un problema inherente "pero puede escribir ''filename ; rm -rf /'' ", y SI el nombre del archivo puede estar dañado, usar subprocess.call no nos brinda ninguna protección .

En realidad, no nos da más detección de errores, de todos modos seguimos dependiendo del retcode de retcode . No necesitamos esperar el proceso secundario, ya que estamos comenzando un proceso separado por un problema.

"Pero se prefiere el subprocess ". Sin embargo, os.system() no está en desuso, y es la herramienta más simple para este trabajo en particular.

Conclusión: el uso de os.system() es la forma más sencilla y directa de hacerlo, y por lo tanto es una respuesta correcta.


En Windows 8.1, a continuación han funcionado, mientras que otras formas dadas con subprocess.call falla con la ruta tiene espacios en ella.

subprocess.call(''cmd /c start "" "any file path with spaces"'')

Al utilizar esta y otras respuestas antes, aquí hay un código en línea que funciona en múltiples plataformas.

import sys, os, subprocess subprocess.call((''cmd /c start "" "''+ filepath +''"'') if os.name is ''nt'' else (''open'' if sys.platform.startswith(''darwin'') else ''xdg-open'', filepath))


Llego bastante tarde al lote, pero aquí hay una solución que usa la API de Windows. Esto siempre abre la aplicación asociada.

import ctypes shell32 = ctypes.windll.shell32 file = ''somedocument.doc'' shell32.ShellExecuteA(0,"open",file,0,0,5)

Una gran cantidad de constantes mágicas. El primer cero es el hwnd del programa actual. Puede ser cero Los otros dos ceros son parámetros opcionales (parámetros y directorio). 5 == SW_SHOW, especifica cómo ejecutar la aplicación. Lea los documentos de la API de ShellExecute para obtener más información.


Para completar (no estaba en la pregunta), xdg-open hará lo mismo en Linux.


Si desea especificar la aplicación para abrir el archivo en Mac OS X, use esto: os.system("open -a [app name] [file name]")


Si quiere ir al subprocess.call() , debería verse así en Windows:

import subprocess subprocess.call((''cmd'', ''/C'', ''start'', '''', FILE_NAME))

No puedes usar:

subprocess.call((''start'', FILE_NAME))

porque start no es un ejecutable sino un comando del programa cmd.exe . Esto funciona:

subprocess.call((''cmd'', ''/C'', ''start'', FILE_NAME))

pero solo si no hay espacios en FILE_NAME.

Mientras que el método subprocess.call cita los parámetros correctamente, el comando de start tiene una sintaxis bastante extraña, donde:

start notes.txt

hace algo más que:

start "notes.txt"

La primera cadena citada debe establecer el título de la ventana. Para que funcione con espacios, tenemos que hacer:

start "" "my notes.txt"

que es lo que hace el código en la parte superior.


Si tiene que usar un método heurístico, puede considerar webbrowser .
Es una biblioteca estándar y, a pesar de su nombre, también intenta abrir archivos:

Tenga en cuenta que, en algunas plataformas, intentar abrir un nombre de archivo utilizando esta función puede funcionar e iniciar el programa asociado del sistema operativo. Sin embargo, esto no es compatible ni portátil. ( Reference )

Intenté este código y funcionó bien en Windows 7 y Ubuntu Natty:

import webbrowser webbrowser.open("path_to_file")

Este código también funciona bien en Windows XP Professional, usando Internet Explorer 8.


Start no admite nombres largos de ruta ni espacios en blanco. Tienes que convertirlo a 8.3 rutas compatibles.

import subprocess import win32api filename = "C://Documents and Settings//user//Desktop/file.avi" filename_short = win32api.GetShortPathName(filename) subprocess.Popen(''start '' + filename_short, shell=True )

El archivo debe existir para funcionar con la llamada API.


Utilice el módulo de subprocess disponible en Python 2.4+, no os.system() , para que no tenga que lidiar con el escape de shell.

import subprocess, os if sys.platform.startswith(''darwin''): subprocess.call((''open'', filepath)) elif os.name == ''nt'': os.startfile(filepath) elif os.name == ''posix'': subprocess.call((''xdg-open'', filepath))

Los dobles paréntesis se deben a que subprocess.call() quiere una secuencia como primer argumento, por lo que estamos usando una tupla aquí. En sistemas Linux con Gnome también hay un comando gnome-open que hace lo mismo, pero xdg-open es el estándar de Free Desktop Foundation y funciona en entornos de escritorio Linux.


Yo prefiero:

os.startfile(path, ''open'')

Tenga en cuenta que este módulo admite nombres de archivos que tienen espacios en sus carpetas y archivos, por ejemplo

A:/abc/folder with spaces/file with-spaces.txt

( python docs ) ''open'' no tiene que ser agregado (es el predeterminado). Los documentos mencionan específicamente que esto es como hacer doble clic en el ícono de un archivo en el Explorador de Windows.

Esta solución es solo de Windows.


en mac os puede llamar ''abierto''

import os os.popen("open myfile.txt")

esto abriría el archivo con TextEdit, o cualquier aplicación que esté configurada como predeterminada para este tipo de archivo


os.startfile (ruta, ''abrir'') en windows es bueno porque cuando existen espacios en el directorio, os.system (''start'', path_name) no puede abrir la aplicación correctamente y cuando el i18n existe en el directorio, os. el sistema necesita cambiar el Unicode al códec de la consola en Windows.


import os import subprocess def click_on_file(filename): ''''''Open document with default application in Python.'''''' try: os.startfile(filename) except AttributeError: subprocess.call([''open'', filename])