如何修复wmctrl当Python打开子进程时无法打开显示

问题描述 投票:0回答:1

这是我的程序,它运行得很好。

import subprocess
result = subprocess.check_output("wmctrl  -l",shell=True,stderr=subprocess.STDOUT)
result = result.decode('UTF-8')
print(result)

输出:

0x03800003 -1 name-PC Desktop

0x03e00037  0 name-PC How to fix wmctrl Cannot open display when Python open subprocess - Stack 
Overflow - Firefox

0x05000006  0 name-PC name@name-PC: ~

0x05a00001  0 name-PC pr.py — ~/Program — Atom

0x05001c85  0 name-PC Terminal

但是如果我想在启动时以Linux Mint的root身份运行这个程序,我就会遇到问题。我想在启动时以root身份运行这个py文件,但我不知道该怎么做。主要问题是如何做到这一点。

这是我尝试解决问题的方法。这是行不通的。

我在文件夹pr.service中添加了一个文件/etc/systemd/system/

[Unit]
After=network.target

[Service]
ExecStart=/usr/local/bin/pr.sh

[Install]
WantedBy=default.target

我在文件夹/usr/local/bin/中创建了一个文件pr.sh:

#!/bin/bash
/usr/bin/python3  '/home/name/Program/pr.py'

我使用了这些命令:

sudo chmod 744 /usr/local/bin/pr.sh
sudo chmod 664 /etc/systemd/system/pr.service
sudo systemctl daemon-reload
sudo systemctl enable pr.service

如果我用命令运行我的程序

systemctl start pr.service

我可以用命令看到这个错误

sudo journalctl -u    pr.service

我有一个错误命令subprocess.CalledProcess错误:命令'wmctrl -l'返回非零退出状态1。

我可以更改我的py文件,例如我可以运行

result = subprocess.check_output("/usr/bin/wmctrl  -l",shell=True,stderr=subprocess.STDOUT)

我可以更改我的py文件以查看错误:

import subprocess
try:
    result = subprocess.check_output("/usr/bin/wmctrl -l -p",shell=True,stderr=subprocess.STDOUT)
    result = result.decode('UTF-8')
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
print(result)

RuntimeError:命令'/ usr / bin / wmctrl -l -p'返回错误(代码1):b'无法打开显示。

我已经读过这个寻找解决方案的尝试:https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux

这是一篇如何在Linux中以root身份自动运行脚本的文章。我做了这些事。

我的主要目标是以root身份自动启动我的程序:

import subprocess
try:
    result = subprocess.check_output("/usr/bin/wmctrl -l -p",shell=True,stderr=subprocess.STDOUT)
    result = result.decode('UTF-8')
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
print(result) 

您不需要在我的解决方案中找到错误。找到任何解决方案都会很有趣。

python linux subprocess wmctrl
1个回答
1
投票

我自己找到了解决方案。关键是使用两个命令:

os.system("xhost local:root &>/dev/null")

允许root打开X窗口。和

 subprocess.check_output([command], shell=True, stderr=subprocess.STDOUT).decode('UTF-8')
command = "env DISPLAY=:0 XAUTHORITY=/home/ourname/.Xauthority "+"wmctrl -l -p -lp" 

允许root读取我们的设置。

所以我们可以重写我们的程序。

import subprocess
import gc
import time
prf = ["env", "DISPLAY=:0",   "XAUTHORITY=/home/ourname/.Xauthority"]
while True:
    r1 = subprocess.run(['xhost', 'local:root'],stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )
    r2 = subprocess.run([prf[0], prf[1], prf[2],"wmctrl", "-l", "-p", "-lp"],  encoding='utf-8', stdout=subprocess.PIPE)
    if r1.returncode == 0 and r1.returncode == 0:
        print("Now we will not have problem with display error")
        break
    time.sleep(3)
while True:
    r1 = subprocess.run([prf[0], prf[1], prf[2],"wmctrl", "-l", "-p", "-lp"],  encoding='utf-8', stdout=subprocess.PIPE)
    for line in r1.stdout.split('\n'):
        print(line)
    time.sleep(3) 
    gc.collect()
© www.soinside.com 2019 - 2024. All rights reserved.