Pulseaudio и sudo в Python

Я запускаю скрипт, который работает с сокетами. Для запуска требуется sudo.. однако внутри скрипта я вызываю другой скрипт, который не требует запуска как sudo

вот код:

import subprocess
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.settimeout(5.0)
host='192.168.1.148'
port=1022
s.bind((host, port))
s.listen(5)
while True:
    c, addr = s.accept()
    subprocess.call("python bluetooth2.py",shell=True)
    print 'got connection from',addr
    c.send('Thank you for connecting')
    #c.settimeout(5.0)
    c.recv(1022)
    c.close()

bluetooth2.py запускает pulseaudio, который по какой-то причине запускается от имени пользователя root и не работает. любая помощь очень ценится!

Вот как выглядит скрипт bluetooth2.py для справки (тот, который вызывает pulseaudio)

import time
import pexpect
from sh import bluetoothctl
import subprocess
mac = "C8:84:47:26:E6:3C"
print ("stuck here")
#bluetoothctl("connect", mac)

def connect():
    child = pexpect.spawn('bluetoothctl')
    child.sendline('power on')
    child.sendline('agent on')
    child.sendline('default-agent')
    child.sendline('pair C8:84:47:26:E6:3C')
    time.sleep(1)
    child.sendline('trust C8:84:47:26:E6:3C')
    time.sleep(1)
    child.sendline('connect C8:84:47:26:E6:3C')
    print("connecting...")
    time.sleep(5)
    subprocess.call("pulseaudio --start",shell=True)
    subprocess.call("pacmd set-default-sink
    bluez_sink.C8_84_47_26_E6_3C",shell=True)
    subprocess.call("aplay /home/pi/bleep_01.wav", shell=True)

person Daveyman123    schedule 09.01.2017    source источник
comment
Может быть, вы можете напрямую импортировать bluetooth2.py и использовать его без создания нового подпроцесса?   -  person bman    schedule 09.01.2017
comment
Кроме того, посмотрите на следующий ответ: stackoverflow.com/a/567599/177006 Это может иметь отношение к вашему вопросу.   -  person bman    schedule 09.01.2017
comment
Я попытался импортировать скрипт, но все равно получаю ту же ошибку от pulseaudio: W: [pulseaudio] main.c: Эта программа не предназначена для запуска от имени пользователя root (если не указан параметр --system).   -  person Daveyman123    schedule 09.01.2017


Ответы (1)


Решение: запустите PulseAudio для всех ваших пользователей

Добавьте следующие строки в файл /etc/systemd/system/pulseaudio.service и сохраните

[Unit]
Description=PulseAudio system server

[Service]
Type=notify
ExecStart=pulseaudio --daemonize=no --system --realtime --log-target=journal

[Install]
WantedBy=multi-user.target
Enable service

sudo systemctl --system enable pulseaudio.service
sudo systemctl --system start pulseaudio.service
sudo systemctl --system status pulseaudio.service

Отредактируйте клиентскую конфигурацию /etc/pulse/client.conf и замените задницу ниже

default-server = /var/run/pulse/native
autospawn = no

Добавить корень в импульсную группу

sudo adduser root pulse-access

И, наконец, перезагрузите систему

person Areg Gasparyan    schedule 01.07.2021