如何修复 Python 打开子进程时 wmctrl 无法打开显示
How to fix wmctrl Cannot open display when Python open subprocess
这是我的程序,效果很好。
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' returned 非零退出状态 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)
运行时错误:命令'/usr/bin/wmctrl -l -p' return 出现错误(代码 1):b'无法打开显示。
我已阅读有关寻找解决方案的尝试:https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux
这是一篇如何以 root 身份在 Linux 中自动执行 运行 脚本的文章。我做了这些事情。
我的主要目标是以 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)
你不需要在我的解决方案中寻找错误。找到任何解决方案都会很有趣。
我自己找到了解决办法。关键是使用两个命令:
os.system("xhost local:root &>/dev/null")
允许 root 打开 X windows。
并且
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()
错误“无法打开显示。”也给我带来了麻烦。这就是我在 Linux Mint 20.3 上解决它的方法——只有显示代码需要与 @ddd777 的答案不同。 xhost 部分不是必需的。
user = 'yourusername'
env = dict(DISPLAY = ':0.0', XAUTHORITY = f'/home/{user}/.Xauthority')
def get(cmd):
return subprocess.check_output(['/bin/bash', '-c', cmd], env=env
).decode('utf-8')
这是我的程序,效果很好。
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' returned 非零退出状态 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)
运行时错误:命令'/usr/bin/wmctrl -l -p' return 出现错误(代码 1):b'无法打开显示。
我已阅读有关寻找解决方案的尝试:https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux
这是一篇如何以 root 身份在 Linux 中自动执行 运行 脚本的文章。我做了这些事情。
我的主要目标是以 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)
你不需要在我的解决方案中寻找错误。找到任何解决方案都会很有趣。
我自己找到了解决办法。关键是使用两个命令:
os.system("xhost local:root &>/dev/null")
允许 root 打开 X windows。 并且
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()
错误“无法打开显示。”也给我带来了麻烦。这就是我在 Linux Mint 20.3 上解决它的方法——只有显示代码需要与 @ddd777 的答案不同。 xhost 部分不是必需的。
user = 'yourusername'
env = dict(DISPLAY = ':0.0', XAUTHORITY = f'/home/{user}/.Xauthority')
def get(cmd):
return subprocess.check_output(['/bin/bash', '-c', cmd], env=env
).decode('utf-8')