WindowsError [ошибка 5] Доступ запрещен
Я использую пакет killableprocess (встроенный поверх подпроцесса) для запуска процессов
Всякий раз, когда я запускаю "killableprocess.Popen(command)" часть кода в моем script, я получаю следующую ошибку:
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
Но когда я запускаю его из интерактивной консоли python (python 2.6), он отлично работает.
Вероятно, это означает, что есть проблемы с правами доступа, когда я запускаю это из script, но я не знаю, как их решить. Я попытался запустить script из cmd, который я запускал как администратор, но это не помогло.
Пробовал искать похожие должности, но не нашел подходящего решения. Надеюсь найти помощь здесь
Я запускаю Windows, в частности Windows 7 Ultimate x64, если это поможет.
спасибо
Ответы
Ответ 1
Я решил проблему, с которой я столкнулся, переключившись на каталог процесса (я пытался использовать inkscape), и он решил мою проблему
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])
Возможно, переход к каталогу процессов будет работать и для вас.
Ответ 2
То, что я обнаружил при работе с этим модулем подпроцесса, состоит в том, что первая запись в 'args' (первый параметр subprocess.Popen()
) должна была быть просто исполняемым именем без пути, и мне нужно было установить executable
в списке аргументов до полного пути моего исполняемого файла.
app = 'app.exe'
appPath = os.path.join(BIN_DIR, app)
commandLine = [app, 'arg1', 'arg2']
process = subprocess.Popen(commandLine, executable=appPath)
Ответ 3
Убедитесь, что ваши пути включают имя исполняемого файла (inkscape.exe)
Ответ 4
В качестве альтернативы, если ваш модуль не работает, вы можете использовать модуль "subprocess":
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
Укажите полный путь к исполняемому файлу, который вы переходите на Popen
(первый элемент в argv
)?