2009-02-17 20 views

Respuesta

3

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

3

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.

+0

Clever. ¿Cómo lo harías tú? – grammar31

+0

Desde http://docs.python.org/library/os.html#os.getppid parece que puedo obtener el ID del proceso, pero no el nombre. – pkit

+0

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

2

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

7

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

+0

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 –

0

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 
Cuestiones relacionadas