2010-06-09 24 views
26

Estoy usando el paquete killableprocess (construido sobre el subproceso) para ejecutar procesos Cada vez que ejecuto el fragmento de código "killableprocess.Popen (command)" en mi script obtengo el siguiente error:WindowsError [error 5] Acceso denegado

File "killableprocess.py", line 157, in _execute_child 
    winprocess.AssignProcessToJobObject(self._job, hp) 
File "winprocess.py", line 37, in ErrCheckBool 
    raise WinError() 
WindowsError [error 5] Access is denied 
Exception TypeError: "'NoneType' object is not callable" in <bound method AutoHANDLE.__del__ of <AutoHANDLE object at 0x025D42B0>> ignored 

Pero cuando lo ejecuto desde la consola interactiva python (python 2.6) funciona bien. Eso probablemente significa que hay problemas de permisos cuando ejecuto esto desde el script, pero no sé cómo resolverlos. Intenté ejecutar el script desde un cmd que ejecutaba como administrador, pero no ayudó. Intenté buscar publicaciones similares pero no encontré ninguna solución buena. Espero encontrar algo de ayuda aquí Estoy corriendo en Windows, específicamente Windows 7 Ultimate x64, si es de alguna ayuda.

gracias

Respuesta

2

Alternativamente, si el módulo no funciona, puede utilizar el «sub-proceso» módulo:

import subprocess, os, time 

process = subprocess.Popen("somecommand", shell=True) 
n = 0 
while True: 
    if not process.poll(): 
     print('The command is running...') 
     if n >= 10: 
      pid = process.pid() 
      os.kill(pid, 9) # 9 = SIGKILL 
    else: 
     print('The command is not running..') 
    n += 1 
    time.sleep(1) 
+0

Sacar los paréntesis en 'process.pid()' ("TypeError: 'int' objeto no es exigible ") –

0

Cómo se detalla ruta completa al ejecutable que está de paso a Popen (el primer artículo en argv)?

9

He resuelto un problema similar que tenía cambiando al directorio del proceso (yo estaba tratando de utilizar Inkscape) y se resolvió mi problema

import subprocess 
inkscape_dir=r"C:\Program Files (x86)\Inkscape" 
assert os.path.isdir(inkscape_dir) 
os.chdir(inkscape_dir) 
subprocess.Popen(['inkscape.exe',"-f",fname,"-e",fname_png]) 

Tal vez de cambiar al directorio del proceso funcione para usted también.

8

Lo que encontré al ejecutar esto con el módulo de subproceso es que la primera entrada en 'args' (el primer parámetro en subprocess.Popen()) necesitaba ser solo el nombre ejecutable sin ruta y necesitaba establecer executable en el argumento lista a la ruta completa de mi ejecutable.

app = 'app.exe' 
appPath = os.path.join(BIN_DIR, app) 

commandLine = [app, 'arg1', 'arg2'] 
process = subprocess.Popen(commandLine, executable=appPath) 
+0

Preste atención también al directorio de trabajo actual; otras respuestas sugieren la necesidad de 'os.chdir (other_dir)' antes de comenzar el proceso y eso puede ser cierto dependiendo de la implementación del proceso en sí. Sin embargo, también puede usar el argumento 'cwd = other_dir' para' Popen' para configurar el cwd sin necesidad de cambiarlo para el script en sí. –

3

Asegúrese de que sus caminos incluyen el nombre del archivo ejecutable (inkscape.exe)

+0

muy difícil de atrapar este! – mireazma

Cuestiones relacionadas