You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:15:19