【Python】sys.argv[ ]简单易懂

本文详细介绍了Python中sys.argv模块的使用,包括sys.argv[0]、sys.argv[1]和sys.argv[2:]的含义及其在命令行参数传递中的应用。通过实例展示了如何获取和处理命令行参数,适合有一定Python基础的读者进一步了解命令行操作。

目录

1.概念

2.0基础?不懂命令行?看这里! 

3.懂些python基础,只想知道sys.argv[ ]用法

3.1 sys.argv[0]:程序本身,也就是0指代码本身

3.2 sys.argv[1]:命令行外部参数被输出

3.3 sys.argv[2:]:命令行外部参数全输出 

 4. 进阶sys.argv.__len__() == 2


1.概念

sys.argv[]本质:获取命令行参数的,sys.argv[0]表示代码本身文件路径。

Sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。

2.0基础?不懂命令行?看这里! 

命令行:输入在终端的一些指令,以下举3个命令行例子,表达的是运行对应的python文件。

  • 第一行是最基础的运行
  • 第二行则相对较复杂一些,但是不要怕,也就是一点点难度啦!
python 001.py
python main.py dream 

3.懂些python基础,只想知道sys.argv[ ]用法

sys.argv[]存在于py文件中,但与命令行息息相关。


3.1 sys.argv[0]:程序本身,也就是0指代码本身

  • python文件中:

  • # main.py
    import sys
    
    a = sys.argv[0]
    print(a)
  • 运行:
  • python main.py
  • 输出:
  • main.py

3.2 sys.argv[1]:命令行外部参数被输出

  • python文件中:
  • #main.py
    import sys
    
    a = sys.argv[1]
    print(a)
  • 运行:
  • python main.py dream
  • 输出:
  • dream

3.3 sys.argv[2:]:命令行外部参数全输出 

  • python文件中: 
  • #main.py        
    import sys
    
    a = sys.argv[2:]
    print(a)
  • 运行:
  • python main.py d r e a m
  • 输出:
  • ['d','r','e','a','m']


 4. 进阶sys.argv.__len__() == 2

  • sys.argv[]:概念已经很明朗了
  • __len__() :作用是返回容器中元素的个数。
  • 不难理解sys.argv.__len__() == 2 就是表示返回元素个数为2
# filename: runner.py import sys, os, json, tempfile, time, ctypes, subprocess import traceback # 第三方:pip install pywin32 pywinauto import win32com.client def is_admin() -> bool: try: return ctypes.windll.shell32.IsUserAnAdmin() except Exception: return False def run_elevated(args: str) -> int: return ctypes.windll.shell32.ShellExecuteW( None, "runas", sys.executable, args, None, 1 ) def run_unelevated(args: str) -> None: shell = win32com.client.Dispatch("Shell.Application") wd = os.path.dirname(os.path.abspath(sys.argv[0])) shell.ShellExecute(sys.executable, args, wd, "", 1) def call_elevated(task: dict) -> dict: with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as f: path_in, path_out = f.name, f.name + ".out.json" f.write(json.dumps(task, ensure_ascii=False).encode("utf-8")) run_elevated(f'"{sys.argv[0]}" --elevated-worker "{path_in}" "{path_out}"') for _ in range(600): if os.path.exists(path_out): with open(path_out, "r", encoding="utf-8") as rf: return json.load(rf) time.sleep(0.05) raise TimeoutError("elevated worker no response") def call_unelevated(task: dict) -> dict: with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as f: path_in, path_out = f.name, f.name + ".out.json" f.write(json.dumps(task, ensure_ascii=False).encode("utf-8")) run_unelevated(f'"{sys.argv[0]}" --ui-worker "{path_in}" "{path_out}"') for _ in range(600): if os.path.exists(path_out): with open(path_out, "r", encoding="utf-8") as rf: return json.load(rf) time.sleep(0.05) raise TimeoutError("ui worker no response") # ============ 这里填你的“管理员权限”任务 ============ def elevated_do_tasks(payload: dict) -> dict: """ 在这里实现你的高权限操作: - 写入 HKLM 注册表 - 修改系统设置/服务 - 执行 netsh/powercfg/dism 等 """ try: results = {} # 示例1:写 HKLM 注册表(需要管理员) import winreg key_path = r"SOFTWARE\MyCompany\MyApp" with winreg.CreateKeyEx(winreg.HKEY_LOCAL_MACHINE, key_path, 0, winreg.KEY_SET_VALUE) as k: winreg.SetValueEx(k, "InstalledBy", 0, winreg.REG_SZ, "runner-elevated") results["registry"] = f"HKLM\\{key_path}\\InstalledBy set." # 示例2:执行管理员命令 cmd = ["cmd.exe", "/c", "powercfg -getactivescheme"] proc = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="ignore") results["powercfg"] = proc.stdout.strip() or proc.stderr.strip() # TODO: 替换为你的实际管理员操作,如: # results["my_task"] = do_admin_thing(payload.get("args")) return {"ok": True, "results": results} except Exception as e: return {"ok": False, "error": str(e), "trace": traceback.format_exc()} # ============ 这里填你的“非管理员 UI 自动化”任务 ============ def ui_do_tasks(payload: dict) -> dict: """ 在这里实现 UI 自动化(资源管理器/Edge): - 必须在非管理员进程里,用 backend="uia" """ try: from pywinauto import Desktop, Application from pywinauto.keyboard import send_keys import time results = {} # 示例A:操作文件资源管理器,读取“项目视图”的可见项 dlg = Desktop(backend="uia").window(title_re=".*文件资源管理器", control_type="Window") dlg.wait("exists ready visible", timeout=10) dlg.set_focus() for _ in range(3): send_keys("{ESC}") time.sleep(0.1) shell_view = dlg.child_window(title_re=".*文件夹视图", control_type="Pane") item_list = shell_view.child_window(title="项目视图", control_type="List") item_list.wait("exists ready visible", timeout=5) item_list.set_focus() visible_items = [it.window_text() for it in item_list.children(control_type="ListItem")] results["explorer_visible"] = visible_items # 示例B:Edge 打开并 Ctrl+Shift+I, 搜索地址(如需) # 如果你需要Edge,取消下面注释 # app = Application(backend="uia") # try: # app.connect(title_re=".*Edge.*") # except: # subprocess.Popen(["msedge.exe"]) # time.sleep(3) # app.connect(title_re=".*Edge.*") # edge = app.window(title_re=".*Edge.*") # edge.set_focus() # send_keys("^l"); time.sleep(0.2) # send_keys("https://www.bing.com"); send_keys("{ENTER}") # time.sleep(2) # send_keys("^+i") # DevTools # time.sleep(1) # TODO: 替换为你的实际 UI 自动化逻辑 # results["my_ui"] = do_ui_thing(payload.get("args")) return {"ok": True, "results": results} except Exception as e: return {"ok": False, "error": str(e), "trace": traceback.format_exc()} # ============ 工人入口 ============ def elevated_worker(path_in: str, path_out: str): with open(path_in, "r", encoding="utf-8") as f: task = json.load(f) result = elevated_do_tasks(task) with open(path_out, "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False) def ui_worker(path_in: str, path_out: str): with open(path_in, "r", encoding="utf-8") as f: task = json.load(f) result = ui_do_tasks(task) with open(path_out, "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False) # ============ 主流程:按需在两种权限之间切换 ============ def main_flow(): # 1) 非管理员:做 UI 自动化 ui_res = call_unelevated({"action": "collect_explorer_visible"}) print("UI:", ui_res) # 2) 管理员:做高权限操作 elev_res = call_elevated({"action": "write_hklm_and_powercfg"}) print("ADMIN:", elev_res) # 3) 如需返回 UI 再做一轮 # ui_res2 = call_unelevated({"action": "do_ui_again"}) # print("UI2:", ui_res2) if __name__ == "__main__": if len(sys.argv) >= 2 and sys.argv[1] == "--elevated-worker": if not is_admin(): run_elevated(" ".join(sys.argv[1:])); sys.exit(0) elevated_worker(sys.argv[2], sys.argv[3]); sys.exit(0) if len(sys.argv) >= 2 and sys.argv[1] == "--ui-worker": if is_admin(): run_unelevated(" ".join(sys.argv)); sys.exit(0) ui_worker(sys.argv[2], sys.argv[3]); sys.exit(0) # 主入口:推荐以“非管理员”启动 exe # 若当前是管理员,也可以照样工作;UI 部分会被分流到非管理员子进程执行 main_flow()我是第一次学python可以跟我讲一下这些是干什么的以及解释一下代码写法的意义吗
最新发布
09-16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值