Es posible detectar si un guión Python se inició desde el símbolo del sistema o si un usuario "hace doble clic" en un archivo .py en el explorador de archivos en Windows ?Detectar script iniciar desde el símbolo del sistema o "doble clic" en Windows
Respuesta
Aquí hay un ejemplo de cómo obtener la identificación del proceso principal y el nombre del script en ejecución actual. Según lo sugerido por Tomalak, esto se puede utilizar para detectar si la secuencia de comandos se inició desde el símbolo del sistema o haciendo doble clic en el explorador.
import win32pdh
import os
def getPIDInfo():
"""
Return a dictionary with keys the PID of all running processes.
The values are dictionaries with the following key-value pairs:
- name: <Name of the process PID>
- parent_id: <PID of this process parent>
"""
# get the names and occurences of all running process names
items, instances = win32pdh.EnumObjectItems(None, None, 'Process', win32pdh.PERF_DETAIL_WIZARD)
instance_dict = {}
for instance in instances:
instance_dict[instance] = instance_dict.get(instance, 0) + 1
# define the info to obtain
counter_items = ['ID Process', 'Creating Process ID']
# output dict
pid_dict = {}
# loop over each program (multiple instances might be running)
for instance, max_instances in instance_dict.items():
for inum in xrange(max_instances):
# define the counters for the query
hq = win32pdh.OpenQuery()
hcs = {}
for item in counter_items:
path = win32pdh.MakeCounterPath((None,'Process',instance, None,inum,item))
hcs[item] = win32pdh.AddCounter(hq,path)
win32pdh.CollectQueryData(hq)
# store the values in a temporary dict
hc_dict = {}
for item, hc in hcs.items():
type,val=win32pdh.GetFormattedCounterValue(hc,win32pdh.PDH_FMT_LONG)
hc_dict[item] = val
win32pdh.RemoveCounter(hc)
win32pdh.CloseQuery(hq)
# obtain the pid and ppid of the current instance
# and store it in the output dict
pid, ppid = (hc_dict[item] for item in counter_items)
pid_dict[pid] = {'name': instance, 'parent_id': ppid}
return pid_dict
def getParentInfo(pid):
"""
Returns a PID, Name tuple of the parent process for the argument pid process.
"""
pid_info = getPIDInfo()
ppid = pid_info[pid]['parent_id']
return ppid, pid_info[ppid]['name']
if __name__ == "__main__":
"""
Print the current PID and information of the parent process.
"""
pid = os.getpid()
ppid, ppname = getParentInfo(pid)
print "This PID: %s. Parent PID: %s, Parent process name: %s" % (pid, ppid, ppname)
dummy = raw_input()
cuando se ejecuta desde el símbolo de sistema en este salidas:
Este PID: 148. Padres PID: 4660, Padres nombre del proceso: cmd
Cuando comenzó haciendo doble clic en el explorador estas salidas:
Este PID: 1896. PID principal: 3788, nombre del proceso principal: explorer
La secuencia de comandos iniciada de símbolo del sistema tiene un proceso principal denominado cmd.exe
(o un proceso inexistente, en caso de que la consola se haya cerrado mientras tanto).
La secuencia de comandos doubleclick-started debe tener un proceso principal denominado explorer.exe
.
Buena pregunta. Una cosa que podría hacer es crear un acceso directo a la secuencia de comandos en Windows y pasar argumentos (utilizando la propiedad Destino del acceso directo) que denotan que la secuencia de comandos se inició al hacer doble clic (en este caso, un acceso directo).
Si se ejecuta desde la línea de comandos hay una variable de entorno adicional 'PROMPT' definida.
Este script se detendrá si se hace clic desde el explorador y se detiene si se ejecuta desde la línea de comandos:
import os
print 'Hello, world!'
if not 'PROMPT' in os.environ:
raw_input()
probado en Windows 7 con Python 2.7
Prueba de dos palabras clave 'PROMPT' y' TCL_LIBRARY'. Comenzando con 1) shell de python, 2) haciendo doble clic en el archivo .py 3) windows cmd: https: //i.stack.imgur.com/CbFUT.jpg –
Pongo esta pequeña función (pybyebye()) justo antes de la declaración de devolución en algunos de mis programas. Lo he probado en Windows 10 en mi computadora de escritorio y portátil y hago lo que quiero, es decir, hace una pausa esperando la entrada del usuario solo cuando el programa se ha iniciado al hacer doble clic en el programa en el Explorador de archivos. Esto evita que la ventana de comando temporal se desvanezca antes de que el usuario lo indique. En Linux, no hace nada. No hay daño de todos modos! Del mismo modo en una Mac.
## PYBYEBYE :
def pybyebye (eprompt="PROMPT",efps="FPS_BROWSER_"):
"nice exit in Windows according to program launch from: IDLE, command, clix."
## first examine environment (os & sys having been imported) :
ui = None
platform = sys.platform
## print("os =",platform)
if not platform.lower().startswith("win"):
return ui ## only relevant in windows
fromidle = False
launched = "Launched from"
if sys.executable.endswith("pythonw.exe"):
fromidle = True ## launched from within IDLE
envkeys = sorted(os.environ)
prompter = eprompt in envkeys
browser = False
for ek in envkeys:
## print(ek)
if ek.startswith(efps):
browser = True
break
## next decide on launch context :
if fromidle and not prompter: ## surely IDLE
## print(launched,"IDLE")
pass ## screen won't disappear
elif browser and not prompter: ## run with double click
## print(launched,"File Explorer")
print("Press Enter to finish ....") ; ui=input()
elif prompter and not fromidle: ## run from preexisting command window
## print(launched,"Command Window")
pass ## screen won't disappear
else: ## something funny going on, Mac or Linux ??
print("launch mode undetermined!")
return ui
- 1. CTRL + V desde el símbolo del sistema de Windows?
- 2. Usar ssh desde el símbolo del sistema de Windows
- 3. Iniciar Visual Studio desde un símbolo del sistema
- 4. Hacer doble clic en el archivo JAR no abre el Símbolo del sistema
- 5. Sendkeys desde el símbolo del sistema
- 6. Ejecutando java desde Eclipse o el símbolo del sistema
- 7. Windows powershell: cambiando el símbolo del sistema
- 8. símbolo del sistema en Windows 7 (funcionalidad nativa)
- 9. Datos de tuberías en el símbolo del sistema de Windows
- 10. ¿Cómo abrir Android adb desde el símbolo del sistema?
- 11. Ejecutando limpieza de SVN desde el símbolo del sistema
- 12. Interceptar clic simple o doble del mouse - solo ejecutar doble clic en el código al hacer doble clic
- 13. Detectar la versión exacta del sistema operativo desde el navegador
- 14. ¿Cómo se ejecutan los archivos ejecutables en Windows 7 utilizando el símbolo del sistema?
- 15. Compilación de código C desde el símbolo del sistema en Windows?
- 16. Abrir o iniciar el teclado del software en el modo de número o símbolo
- 17. sqlite desde el símbolo del sistema: comando no reconocido
- 18. Cómo ejecutar nodejs sin símbolo del sistema en Windows?
- 19. ¿Cómo iniciar el script de PowerShell desde la línea de comando del sistema operativo?
- 20. Cambiar el destino de un acceso directo desde el símbolo del sistema
- 21. Deshabilitar el doble clic del mouse con javascript o jquery
- 22. salida del árbol en símbolo del sistema
- 23. ¿Cómo puedo determinar el sistema operativo del sistema desde un script Lua?
- 24. Detectar clics del mouse en script bash
- 25. ¿Cómo uso espacios en el símbolo del sistema?
- 26. Bash 'printf' equivalente para símbolo del sistema?
- 27. iniciar el servicio de Windows desde java
- 28. 'Esperando' animación en el símbolo del sistema (Python)
- 29. incapaz de redirigir el mensaje de salida en el símbolo del sistema de Windows (cmd.exe)
- 30. Formato de codificación del archivo mediante el símbolo del sistema: Windows
Clever. ¿Cómo lo harías tú? – grammar31
Desde http://docs.python.org/library/os.html#os.getppid parece que puedo obtener el ID del proceso, pero no el nombre. – pkit
Depende. ¿Qué herramientas tienes disponibles? ¿Desea verificar desde el script python o desde afuera? En cualquier caso, "¿Cómo puedo averiguar la información de proceso de Win32 usando Python?" Es un buen material para una pregunta separada. – Tomalak