web-dev-qa-db-fra.com

WindowsError [erreur 5] L'accès est refusé

J'utilise le package killableprocess (construit sur le sous-processus) pour l'exécution des processus Chaque fois que j'exécute le morceau de code "killableprocess.Popen (commande)" dans mon script, l'erreur suivante apparaît:

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

Mais lorsque je l'exécute à partir de la console interactive Python (Python 2.6), cela fonctionne bien ... Cela signifie probablement qu'il y a des problèmes d'autorisations lorsque je lance ceci à partir du script, mais je ne sais pas comment les résoudre. J'ai essayé d'exécuter le script à partir d'un cmd que j'avais exécuté en tant qu'administrateur, mais cela n'a pas aidé… .. J'ai essayé de rechercher des messages similaires, mais je n'ai trouvé aucune bonne solution. J'espère trouver de l'aide ici Je suis sous Windows, en particulier Windows 7 Ultimate x64, si cela peut vous aider.

merci

26
Serg

J'ai résolu un problème similaire en passant dans le répertoire de processus (j'essayais d'utiliser inkscape) et le problème a été résolu.

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

Peut-être que le passage au répertoire de processus fonctionnera aussi pour vous.

13
tjb

Ce que j’ai constaté lors de l’exécution de ce sous-processus avec le module de sous-processus est que la première entrée de 'args' (le premier paramètre de subprocess.Popen()) devait être uniquement le nom de l’exécutable sans chemin et que je devais définir le paramètre executable dans la liste des arguments au maximum. chemin de mon exécutable.

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

commandLine = [app, 'arg1', 'arg2']
process = subprocess.Popen(commandLine, executable=appPath)
8
dash-tom-bang

Assurez-vous que vos chemins incluent le nom du fichier exécutable (inkscape.exe).

3
oabarca

Alternativement, si votre module ne fonctionne pas, vous pouvez utiliser le module «sous-processus»:

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) 
2
user563964

Spécifiez-vous chemin complet à l'exécutable que vous passez à Popen (le premier élément de argv)? 

0
ulidtko