Я изучал, как перезапустить мой код Python с правами администратора, и смог найти ответ:
import sys
import os
from win32comext.shell import shell
asadmin = 'asadmin'
if sys.argv[-1] != asadmin:
script = os.path.abspath(sys.argv[0])
params = ' '.join([script] + sys.argv[1:] + [asadmin])
shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
sys.exit(0)
В случае, когда я предоставляю привилегии во всплывающем окне Windows в контексте (например, «Хотите ли вы, чтобы это приложение вносило изменения в ваше устройство?»), все работает нормально, но когда я выбираю вариант не делать этого, вывод консоль выдает мне ошибку 'pywintypes.error: (1223, 'ShellExecuteEx', 'Операция была отменена пользователем.')', что имеет полный смысл.
Поэтому я попытался уловить эту ошибку, добавив блок try/Exception следующим образом:
import ctypes
import sys
import os
from win32comext.shell import shell
from win32ctypes.pywin32 import pywintypes # Importing pertinent module
try:
if sys.argv[-1] != asadmin:
script = os.path.abspath(sys.argv[0])
params = ' '.join([script] + sys.argv[1:] + [asadmin])
shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
sys.exit(0)
except pywintypes.error:
pass
Кажется, это правильно, однако я все еще получаю ту же ошибку, другими словами, строка «кроме ...» не работает. Я могу решить эту проблему, заменив ее на «кроме исключения», но я знаю, что это плохая практика, и мне очень любопытно, почему это не работает... Есть предложения, как это можно исправить? Заранее спасибо.
Изменить - добавление полного отслеживания ошибки
Traceback (most recent call last):
File "C:\Users\....myproject.py", line 13, in <module>
shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
pywintypes.error: (1223, 'ShellExecuteEx', 'The operation was canceled by the user.')
@Guy Добавлен полный отслеживание.
Но какой смысл в except: pass
? Вы просто пытаетесь избежать обратной трассировки? Вероятно, ваш код должен каким-то образом уведомить пользователя о том, что действие не может быть выполнено.
@tripleee Блок кода, представленный в вопросе, является частью моего проекта, где я заменил имя ошибки на «Исключение». Само по себе это работает, но я считаю, что использование общих утверждений — плохая практика, и я действительно хочу выяснить, почему это не работает.
Скорее всего, вы используете неправильный импорт.
Попробуйте импортировать его напрямую, например
import pywintypes
Ух ты, это было так просто... Я пытался сделать это раньше, но PyCharm это не понравилось («Невозможно найти ссылку на «ошибку» в «pywintypes.py»), поэтому по какой-то причине я даже не запускал программу. . Большое спасибо, чувак!
@LeonardBetts, добро пожаловать!
В чем заключается возникшая ошибка? возможно
pywintypes.error
не предполагается его поймать.