好吧,这很奇怪。我一整天都在与这个斗争,但到目前为止还没有成功。我正在开发一个基于 Python 的项目。该项目是通过 systemd 脚本启动的。奇怪的是 vlc/cvlc 在一定程度上可以工作,但没有 dbus 控制。如果我从命令行运行 python 应用程序,一切都会完美运行。从 systemd 运行应用程序是很奇怪的。
例如,当使用以下代码和服务脚本运行它时,我无法使用 dbus 控制 vlc。如果我在 systemd 脚本之外运行 python,我可以访问 dbus。还有另一个奇怪的问题,它是导致此问题的任何因素的副作用。它可以正常运行 1080 vid,但不能运行 4k。尝试一下以下内容,如果您能解决,请告诉我。我非常感谢任何和所有的帮助。谢谢!
Python代码(testvlc):
#!/usr/bin/env python
from subprocess import Popen, PIPE
import time
vid = 'somevideo.mp4'
cmd = 'DISPLAY=:0 cvlc -f --no-osd %s -L' % vid
Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
while True:
print("Hello!")
time.sleep(5)
系统脚本(testvlc.service):
[Unit]
Description=Test VLC From Python Script
[Service]
User=user
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc
[Install]
WantedBy=multi-user.target
答案1
[Unit]
Description=Test VLC From Python Script
[Service]
User=user
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc
[Install]
WantedBy=multi-user.target
另外,如果你从中运行它,~/.config/systemd/user
一切都会正常运行,包括 4K。将 Wantby 更改为default.target
& 添加 a After=graphical-session.target
,删除User=
& the Environment=
, & 使用systemctl --user
答案2
我一直在做类似的事情,从某种意义上说,我想通过 DBus 从 python 控制 VLC。
我所做的是将 VLC 设置为 DBus 可激活服务。为此,我需要做两件事:
- 定义DBus服务
- 为 VLC 定义 systemd 单元文件,当 dbus 检测到 #1 中的活动时将激活该文件。
对于 DBus 服务,我需要在/usr/share/dbus-1/services
.我叫它org.mpris.MediaPlayer2.vlc.service
。不幸的是,我找不到在用户目录中设置它的方法。
# /usr/share/dbus-1/services/org.mpris.MediaPlayer2.vlc.service
[D-BUS Service]
Name=org.mpris.MediaPlayer2.vlc
Exec=/bin/false
SystemdService=vlc.service
Name
有了这些信息,我们告诉 DBus,与( )定义的总线有关的任何活动org.mpris.MediaPlayer2.vlc
都需要激活该服务vlc.service
。因此,我们需要通过 systemd 单元文件来定义此类服务。您可以将此文件放置在~/.config/sytemd/user/
(对于用户服务)或/usr/lib/systemd/user/
(对于系统服务)中。
# vlc.service
[Unit]
Description=VLC media player DBus activated service
[Service]
Type=dbus
BusName=org.mpris.MediaPlayer2.vlc
Environment=""
ExecStart=/home/jbellon/test/ytube-dl/vlc/install/usr/bin/vlc -I "dummy"
注意,这里的服务类型是DBus。您可以在 Systemd 单元文件文档中查看 DBus 服务的属性。
自从我弄对它以来已经有一段时间了(从那以后我不敢改变它),但我认为我在使用时遇到了问题cvlc
,所以我直接使用虚拟接口()来执行主程序-I "dummy"
,这基本上是一样。
一旦我解决了这个问题,您只需要确保 Systemd 知道 VLC 服务 ( systemctl daemon-reload
),DBus 也知道(您需要为此重新启动 DBus)。
要测试它,您可以尝试向 DBus 服务查询任何内容,例如内省接口:
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: inactive (dead)
$ gdbus introspect --session --dest org.mpris.MediaPlayer2.vlc -o /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2 &> /dev/null
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: active (running) since Mon 2020-08-17 22:43:53 BST; 1s ago
Main PID: 56522 (vlc)
Tasks: 4 (limit: 38349)
Memory: 2.0M
CPU: 13ms
CGroup: /user.slice/user-1000.slice/[email protected]/vlc.service
└─56522 /usr/bin/vlc -I dummy