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
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.
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)
Assurez-vous que vos chemins incluent le nom du fichier exécutable (inkscape.exe).
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)
Spécifiez-vous chemin complet à l'exécutable que vous passez à Popen
(le premier élément de argv
)?