Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh menjalankan skrip Python dengan keistimewaan yang tinggi pada Windows?
Banyak tugas dalam pembangunan aplikasi memerlukan keistimewaan yang tinggi, terutamanya apabila berinteraksi dengan sumber sistem atau melaksanakan operasi pentadbiran. Artikel ini menangani masalah khusus menjalankan skrip dalam Python yang memerlukan akses pentadbiran.
Sampel kod yang disediakan cuba untuk memulakan skrip dengan keizinan tinggi. Walau bagaimanapun, skrip tidak pernah melepasi gesaan kebenaran. Isu ini nampaknya terletak pada salah tanggapan umum mengenai pelaksanaan skrip.
Kod yang disediakan adalah berdasarkan andaian bahawa ia boleh meningkatkan sendiri dengan memulakan semula dirinya dengan hak pentadbir . Walau bagaimanapun, pendekatan ini tidak boleh dilaksanakan kerana sifat operasi istimewa dalam Windows. Sebaliknya, kita mesti menggunakan mekanisme luaran untuk meminta ketinggian.
Satu penyelesaian yang sangat berkesan ialah skrip komprehensif yang dicipta oleh Preston Landers pada 2010. Skrip ini membolehkan pengguna menyemak dengan mudah sama ada pengguna semasa mempunyai keistimewaan pentadbiran dan, jika tidak , minta ketinggian UAC. Skrip menyediakan maklum balas visual dalam tetingkap berasingan, menunjukkan tindakan sistem.
Skrip boleh disepadukan ke dalam aplikasi utama anda menggunakan coretan berikut:
import admin if not admin.isUserAdmin(): admin.runAsAdmin()
Kod skrip penuh boleh didapati di bawah:
#!/usr/bin/env python # -*- coding: utf-8; mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- # vim: fileencoding=utf-8 tabstop=4 expandtab shiftwidth=4 # (C) COPYRIGHT © Preston Landers 2010 # Released under the same license as Python 2.6.5 import sys, os, traceback, types def isUserAdmin(): if os.name == 'nt': import ctypes # WARNING: requires Windows XP SP2 or higher! try: return ctypes.windll.shell32.IsUserAnAdmin() except: traceback.print_exc() print "Admin check failed, assuming not an admin." return False elif os.name == 'posix': # Check for root on Posix return os.getuid() == 0 else: raise RuntimeError, "Unsupported operating system for this module: %s" % (os.name,) def runAsAdmin(cmdLine=None, wait=True): if os.name != 'nt': raise RuntimeError, "This function is only implemented on Windows." import win32api, win32con, win32event, win32process from win32com.shell.shell import ShellExecuteEx from win32com.shell import shellcon python_exe = sys.executable if cmdLine is None: cmdLine = [python_exe] + sys.argv elif type(cmdLine) not in (types.TupleType,types.ListType): raise ValueError, "cmdLine is not a sequence." cmd = '"%s"' % (cmdLine[0],) # XXX TODO: isn't there a function or something we can call to massage command line params? params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]]) cmdDir = '' showCmd = win32con.SW_SHOWNORMAL #showCmd = win32con.SW_HIDE lpVerb = 'runas' # causes UAC elevation prompt. # print "Running", cmd, params # ShellExecute() doesn't seem to allow us to fetch the PID or handle # of the process, so we can't get anything useful from it. Therefore # the more complex ShellExecuteEx() must be used. # procHandle = win32api.ShellExecute(0, lpVerb, cmd, params, cmdDir, showCmd) procInfo = ShellExecuteEx(nShow=showCmd, fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, lpVerb=lpVerb, lpFile=cmd, lpParameters=params) if wait: procHandle = procInfo['hProcess'] obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE) rc = win32process.GetExitCodeProcess(procHandle) #print "Process handle %s returned code %s" % (procHandle, rc) else: rc = None return rc def test(): rc = 0 if not isUserAdmin(): print "You're not an admin.", os.getpid(), "params: ", sys.argv #rc = runAsAdmin(["c:\Windows\notepad.exe"]) rc = runAsAdmin() else: print "You are an admin!", os.getpid(), "params: ", sys.argv rc = 0 x = raw_input('Press Enter to exit.') return rc if __name__ == "__main__": sys.exit(test())
Sebagai alternatif, anda kini boleh pasang dan gunakan skrip ini sebagai pakej Python daripada PyPi. Ikuti langkah berikut:
import pyuac def main(): print("Do stuff here that requires being run as an admin.") # The window will disappear as soon as the program exits! input("Press enter to close the window. >") if __name__ == "__main__": if not pyuac.isUserAdmin(): print("Re-launching as admin!") pyuac.runAsAdmin() else: main() # Already an admin here.
Atau , gunakan penghias:
from pyuac import main_requires_admin @main_requires_admin def main(): print("Do stuff here that requires being run as an admin.") # The window will disappear as soon as the program exits! input("Press enter to close the window. >") if __name__ == "__main__": main()
Atas ialah kandungan terperinci Bagaimanakah saya boleh menjalankan skrip Python dengan keistimewaan yang tinggi pada Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!