2010-06-09 5 views
26

Ich benutze das killableprocess-Paket (auf dem Unterprozess aufgebaut) zum Ausführen von Prozessen Immer wenn ich den Code "killableprocess.Popen (command)" in meinem Skript ausführen, bekomme ich die folgender Fehler:WindowsError [Fehler 5] Zugriff verweigert

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 

Aber wenn ich es von der interaktiven Python-Konsole (Python 2.6) ausführen, funktioniert es gut. Das bedeutet wahrscheinlich, es gibt Berechtigungsprobleme, wenn ich dies vom Skript ausführen, aber ich weiß nicht, wie man sie löst. Ich habe versucht, das Skript von einem Cmd ausführen, die ich als Administrator ausgeführt, aber es hat nicht geholfen. Versucht, nach ähnlichen Posts zu suchen, fand aber keine gute Lösung. Ich hoffe, hier Hilfe zu finden Ich bin auf Windows, speziell Windows 7 Ultimate x64, wenn es irgendeine Hilfe ist.

dank

Antwort

2

Alternativ, wenn Ihr Modul nicht funktioniert, Sie «subprocess» Modul verwenden können:

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

die Klammern Nehmen Sie auf 'process.pid()' ("Typeerror:‚int‘Objekt ist nicht aufrufbar ") –

0

Sie vollständigen Pfad ausführbaren Sie vorbei zu Popen spezifizieren Sie (der erste Artikel in argv)?

9

Ich löste ein ähnliches Problem, das ich durch die Umstellung auf den Prozess Verzeichnis hatte (ich versuche, inkscape zu verwenden) und es mein Problem gelöst

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

Vielleicht zum Prozess Verzeichnis Schalt auch für Sie arbeiten.

8

Was ich fand, wenn sie in diese mit dem Subprozess-Modul ausgeführt ist, dass der erste Eintrag in ‚args‘ (der erste Parameter subprocess.Popen()) ohne Pfad nur den Namen der ausführbaren Datei sein musste und ich brauchte executable im Argument zu setzen listet den vollständigen Pfad meiner ausführbaren Datei auf.

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

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

Beachten Sie auch das aktuelle Arbeitsverzeichnis; Andere Antworten legen nahe, dass Sie vor dem Starten des Prozesses "os.chdir (other_dir)" benötigen, was je nach Implementierung des Prozesses selbst wahr sein kann. Sie können aber auch einfach das 'cwd = other_dir' Argument zu' Popen' verwenden, um das cwd zu setzen, ohne es für das Skript selbst ändern zu müssen. –

3

Stellen Sie sicher, dass Ihre Wege den Namen der ausführbaren Datei (inkscape.exe) umfassen

+0

sehr schwer, diesen zu fangen! – mireazma