VLC を実行する Systemd+ Python スクリプトでは、dbus コントロールが VLC にアクセスすることはできません。

VLC を実行する Systemd+ Python スクリプトでは、dbus コントロールが VLC にアクセスすることはできません。

さて、これは変です。私は一日中これと戦ってきましたが、これまで成功していませんでした。私は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/user4Kを含むすべてがうまく動作します。 Wantbyを次に変更し、default.target&を追加しAfter=graphical-session.targetUser=&を削除しEnvironment=、&を使用します。systemctl --user

答え2

私はDBusを介してPythonでVLCを制御したいという意味で同様のことをしました。

私がしたことは、VLCをDBus有効サービスに設定することでした。これを行うには、次の2つのことを行う必要があります。

  1. DBusサービス定義
  2. dbusが#1でアクティビティを検出したときにアクティブになるVLC用のシステム単位ファイルを定義します。

DBusサービスには/usr/share/dbus-1/services.I call itが必要です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この情報を使用して、()で定義されたバスに関連するすべてのアクティビティにorg.mpris.MediaPlayer2.vlcサービスのアクティブ化が必要であることをDBusに通知しますvlc.service。したがって、システム単位ファイルを介してこれらのサービスを定義する必要があります。このファイルを~/.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 Unit File DocumentationでDBusサービスのプロパティを表示できます。

それを見つけたのはかなり時間がかかりましたが(それ以降は変更するのが怖かったです)、問題があると思ってcvlc仮想インターフェイス()を使用して基本プログラムを実行しました-I "dummy"。基本的には同じです。 。

この問題を解決したら、SystemdがVLCサービス()を知っていてDBusも知っていることを確認してくださいsystemctl daemon-reload(これを行うには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

関連情報