WindowsError [error 5] Access is denied

2019-01-11 10:27发布

问题:

I'm using the killableprocess package (built on top of subprocess) for running processes Whenever I run the "killableprocess.Popen(command)" piece of code in my script I get the following error:

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

But when I run it from the python interactive console (python 2.6) it works fine. That probably means there are permission issues when I run this from the script, but I don't know how to solve them. I tried running the script from a cmd that I ran as administrator, but it didn't help. Tried looking for similar posts but didn't find any good solution. Hope to find some help here I'm running on Windows, specifically Windows 7 Ultimate x64, if it's any help.

thanks

回答1:

I solved a similar problem I had by switching to the process directory (I was trying to use inkscape) and it solved my problem

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

Maybe switching to the process directory will work for you too.



回答2:

What I found when running into this with the subprocess module is that the first entry in 'args' (the first parameter to subprocess.Popen()) needed to be just the executable name with no path and I needed to set executable in the argument list to the full path of my executable.

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

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


回答3:

Make sure that your paths include the name of the executable file (inkscape.exe)



回答4:

Alternatively, if your module doesn't work, you can use the «subprocess» module:

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) 


回答5:

Do you specify full path to executable you are passing to Popen (the first item in argv)?