簡體   English   中英

使用 os.execvp() 通過 pkexec 調用 Python 腳本(使用基於 Tkinter 的 GUI)並在之前設置環境變量

[英]Use os.execvp() to call Python script (with Tkinter based GUI) via pkexec and setting environment variables before

這是Use tkinter based PySimpleGUI as root user via pkexec的后續問題。

我有一個 Python GUI 應用程序。 它應該能夠以用戶和 root 身份運行。 對於后者,我知道我必須設置$DISPLAY$XAUTHORITY才能讓 GUI 應用程序在 root 下運行。 我使用pkexec以 root 身份啟動該應用程序。

我認為問題是我如何使用os.getexecvp()來調用pkexec及其所有參數。 但我不知道如何解決這個問題。 在鏈接的上一個問題和答案中,它在通過 bash 直接調用pkexec時有效。

對於該示例,腳本的完整路徑應為/home/user/x.py

#!/usr/bin/env python3
# FILENAME need to be x.py !!!
import os
import sys
import getpass
import PySimpleGUI as sg


def main_as_root():
    # See: https://stackoverflow.com/q/74840452
    cmd = ['pkexec',
           'env',
           f'DISPLAY={os.environ["DISPLAY"]}',
           f'XAUTHORITY={os.environ["XAUTHORITY"]}',
           f'{sys.executable} /home/user/x.py']

    # output here is
    # ['pkexec', 'env', 'DISPLAY=:0.0', 'XAUTHORITY=/home/user/.Xauthority', '/usr/bin/python3 ./x.py']
    print(cmd)

    # replace the process
    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()  # no return because of os.execvp()

    # else
    main()

將該腳本稱為/home/user/x.py root意味着該腳本將通過pkexec再次調用自身。 我得到了這個輸出(從德語自我翻譯成英語)。

['pkexec', 'env', 'DISPLAY=:0.0', 'XAUTHORITY=/home/user/.Xauthority', '/usr/bin/python3 /home/user/x.py']
/usr/bin/env: „/usr/bin/python3 /home/user/x.py“: File or folder not found
/usr/bin/env: Use -[v]S, to takeover options via #!

對我來說,命令的python3部分似乎是由env而不是pkexec解釋的。 通過os.pkexec()解釋cmd時有些不符合預期。

但是當我在 shell 上執行此操作時,它運行良好。

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY python3 /home/user/x.py

基於@TheLizzard 評論。 方法本身沒問題,沒有問題。

只是命令數組cmd中的最后一個元素。 應該拆分。

cmd = ['pkexec',
       'env',
       f'DISPLAY={os.environ["DISPLAY"]}',
       f'XAUTHORITY={os.environ["XAUTHORITY"]}',
       f'{sys.executable}',
       '/home/user/x.py']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM