使用os.execvp()通过pkexec调用带GUI的Python脚本并设置环境变量报错
解决os.execvp调用pkexec时的参数解析问题
问题出在参数拆分错误——你把Python解释器路径和脚本路径合并成了一个字符串参数传给env,但env会把整个带空格的字符串当作单个命令文件路径,自然找不到这个不存在的"文件"。而在shell里执行时,shell会自动按空格分割参数,所以能正常运行。
修复后的代码
关键是将Python解释器和脚本路径拆分为两个独立的参数项,而非合并成一个字符串:
#!/usr/bin/env python3 # FILENAME need to be x.py !!! import os import sys import getpass import PySimpleGUI as sg def main_as_root(): cmd = ['pkexec', 'env', f'DISPLAY={os.environ["DISPLAY"]}', f'XAUTHORITY={os.environ["XAUTHORITY"]}', sys.executable, # 单独作为参数 '/home/user/x.py'] # 单独作为参数 print(cmd) os.execvp(cmd[0], cmd) def main(): main_window = sg.Window(title=f'Run as "{getpass.getuser()}".', layout=[[]], margins=(100, 50)) main_window.read() if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == 'root': main_as_root() main()
修复逻辑说明
修改后,env会先处理DISPLAY和XAUTHORITY环境变量的设置,再调用sys.executable指定的Python解释器,执行后面的脚本路径,和你在shell中手动执行的命令逻辑完全一致。此时os.execvp传递的参数列表为:
['pkexec', 'env', 'DISPLAY=:0.0', 'XAUTHORITY=/home/user/.Xauthority', '/usr/bin/python3', '/home/user/x.py']
每个参数都被正确拆分,不会再出现"找不到文件"的错误。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

