簡體   English   中英

使用/不使用 sudo 運行 python 程序的一部分

[英]Running part of python program with/without sudo

我正在嘗試使用rpi_ws281x使用來自pyaudio的一些音頻作為輸入來控制我的 Raspberry Pi Zero 2w 上的一些 LED。 其中一個需要sudo,另一個只在沒有sudo的情況下工作......

我嘗試在沒有 sudo 的腳本中導入rpi_ws281x 崩潰是因為“打開 \dev\mem 的權限被拒絕”。 所以程序必須以 sudo 權限運行才能控制 ledstrip。 但是,在使用 sudo 調用時在該腳本中使用pyaudio ,我收到此錯誤: OSError: [Errno -9996] Invalid input device (no default output device)

為了驗證問題出在使用 sudo 上,我使用rpi_ws281xpyaudio制作了兩個最小的工作示例。 第一個僅適用於 sudo,第二個僅適用於 sudo。

有什么解決辦法嗎? 我不是 pulseaudio 方面的專家,所以即使 pyaudio 由使用 sudo 運行的程序運行,也可能讓它接受連接。

否則的話,我猜應該可以把程序分成兩部分。 一個使用 sudo 運行,另一個不使用。 但是他們將如何有效地溝通(假設每秒需要大約 20 次更新)? 提前致謝!

如果需要,這里是 pyaudio 在使用 sudo 運行時吐出的整個錯誤:

ALSA lib pcm_dsnoop.c:638:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1075:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.USB-Audio.pcm.hdmi.0:CARD=1,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM hdmi
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.USB-Audio.pcm.hdmi.0:CARD=1,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM hdmi
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Access denied

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Access denied

ALSA lib pcm_a52.c:823:(_snd_pcm_a52_open) a52 is only for playback
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
ALSA lib pcm_dmix.c:1075:(snd_pcm_dmix_open) unable to open slave
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Access denied

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Access denied

Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
Recording
Traceback (most recent call last):
  File "/home/pi/Documents/test.py", line 15, in <module>
    stream = p.open(format=sample_format,
  File "/home/pi/environments/flask-env/lib/python3.9/site-packages/pyaudio.py", line 754, in open
    stream = Stream(self, *args, **kwargs)
  File "/home/pi/environments/flask-env/lib/python3.9/site-packages/pyaudio.py", line 445, in __init__
    self._stream = pa.open(**arguments)
OSError: [Errno -9996] Invalid input device (no default output device)

好吧,所以我在谷歌搜索和搞亂我的 pulseaudio 安裝足夠多次后解決了這個問題,以保證比我願意承認的更頻繁地重新安裝。

rpi_ws281x需要 PWM 引腳(Pi Zero 2w 上的 GPIO 18),它需要 sudo 權限。 所以解決方案是將 pulseaudio 作為系統服務運行,而不是用戶服務。

現在,Pulseaudio 的創建者警告不要這樣做,但在這種情況下沒關系,因為 Pi(在這種情況下)並不是真的要讓用戶登錄。

將 pulseaudio 設置為系統服務,並不是很復雜(請參閱此):

首先,禁用用戶模式(如果已啟用):

sudo systemctl --global disable pulseaudio.service pulseaudio.socket

創建一個 systemd 文件 (/etc/systemd/system/pulseaudio.service):

[Unit]
Description=PulseAudio Daemon
 
[Install]
WantedBy=multi-user.target
 
[Service]
Type=simple
PrivateTmp=true
ExecStart=/usr/bin/pulseaudio --system --realtime --disallow-exit --no-cpu-limit 

將 pulse 和 pi 用戶添加到所需的組:

sudo usermod -a -G audio pulse #add pulse to audio group
sudo usermod -a -G pulse-access pi #add pi to pulse-access group
sudo usermod -a -G pulse-access root #add root to pulse-access group

最后,啟動服務:

sudo systemctl enable pulseaudio.service
sudo systemctl start pulseaudio.service

現在,使用 sudo 運行的腳本應該能夠與 pulseaudio 交互。 我只用PyAudio驗證了這一點,但它也應該適用於其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM