Как запустить программу внутри виртуальной среды из скрипта

Я настроил Google Assistant SDK на своем Raspberry Pi, как показано здесь: https://developers.google.com/assistant/sdk/prototype/getting-started-pi-python/run-sample

Теперь, чтобы повторно запустить помощника, я разработал две команды:

$ source env/bin/activate

а также

(env) $ google-assistant-demo

однако я хочу автоматизировать этот процесс в сценарии, который я могу вызвать из rc.local (за которым следует &), чтобы помощник загружался при запуске.

Однако, если я запускаю простой скрипт

#!/bin/bash
source env/bin/activate
google-assistant-demo

помощник не запускается внутри среды мой путь к среде /home/pi/env/bin/activate Как сделать так, чтобы сценарий запускал среду, а затем запускал помощника внутри виртуальной среды?

РЕДАКТИРОВАТЬ: В конце концов я пошел со следующим методом:

взяв это за основу: https://youtu.be/ohUszBxuQA4?t=774 – благодаря Эрику Паризо

Вам нужно будет загрузить файл src, который он использует, и извлечь его содержимое в /home/pi/src/

Однако с некоторыми изменениями.

Я не запускал gassist.sh как sudo, так как это выдавало следующую ошибку:

OpenAlsaHandle PcmOpen: No such file or directory
[7689:7702:ERROR:audio_input_processor.cc(756)] Input error
ON_MUTED_CHANGED:
{‘is_muted’: False}
ON_START_FINISHED
ON_ASSISTANT_ERROR:
{‘is_fatal’: True}
[7689:7704:ERROR:audio_input_processor.cc(756)] Input error
ON_ASSISTANT_ERROR:
{‘is_fatal’: True}

Исправление: НЕ запускайте как sudo

Если gassist.sh выдает ошибку о RPi.GPIO, вам нужно сделать https://youtu.be/ohUszBxuQA4?t=580 :

$ cd /home/pi/env/bin
$ source activate
(env) $ pip install RPi.GPIO
(env) $ deactivate

А потом я сделал sudo nano /etc/profile и добавил это в конец:

#Harvs was here on 24/06/17
if pidof -x "gassist.sh" >/dev/null; then
    echo ""
    echo "/etc/profile says:"
    echo "An instance of Google Assistant is already running, will not start again"
    echo ""
else
    echo "Starting Google Assistant..."
    echo "If you are seeing this, perhaps you have SSH within seconds of reboot"
    /home/pi/src/gassist.sh &
fi

И теперь он отлично работает, причем внутри виртуальной среды :)


person Harvs    schedule 28.05.2017    source источник
comment
source /home/pi/env/bin/activate помогает?   -  person phd    schedule 29.05.2017
comment
Возможный дубликат Почему люди пишут #!/usr/bin/env python в первой строке скрипта Python?   -  person Towerss    schedule 01.06.2017


Ответы (3)


нашел решение здесь: https://raspberrypi.stackexchange.com/a/45089

Создайте сценарий запуска оболочки в корневом каталоге (я назвал свой «запуск»), также сделайте его исполняемым:

sudo nano launch.sh

Я так и написал:

#!/bin/bash
source /home/pi/env/bin/activate
/home/pi/env/bin/google-assistant-demo

Сохраните файл

Отредактируйте файл автозапуска LXDE-pi.

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

Добавьте это в конец этого файла

./launch.sh

перезагрузка

person Eric Parisot    schedule 06.06.2017
comment
Это сработало очень хорошо, спасибо, намного лучше, чем многие сложные решения, которые я видел в других местах. одно незначительное изменение заключается в том, что (я думаю) вам нужно chmod +x сценарий, чтобы он работал! Кроме того, несмотря на первую строку, он на самом деле не запускает скрипт внутри окружения, но он все еще работает, так что ладно! - person Harvs; 23.06.2017
comment
Одна проблема с этим методом заключается в том, что он не работает при загрузке в режиме CLI, а загружается только в GUI. - person Harvs; 24.06.2017
comment
Еще один способ запуска в CLI: ://youtu.be/ohUszBxuQA4 - person Eric Parisot; 24.06.2017

Скрипты, запускаемые из rc.local, выполняются в корневом каталоге (или, возможно, в домашнем каталоге пользователя root, я думаю, в зависимости от дистрибутива?)

Простое решение — указать полный путь к среде.

#!/bin/bash
source /home/pi/env/bin/activate
google-assistant-demo
# or maybe /home/pi/google-assistant-demo

Нет необходимости явно указывать что-либо в rc.local

person tripleee    schedule 01.06.2017

В итоге я пошел по следующему методу:

взяв это за основу: https://youtu.be/ohUszBxuQA4?t=774 – благодаря Эрику Паризо

Однако с некоторыми изменениями.

Вам нужно скачать файл src, который он использует, и извлечь его содержимое в /home/pi/src/

Я не запускал gassist.sh как sudo, так как это дало мне следующую ошибку:

OpenAlsaHandle PcmOpen: No such file or directory
[7689:7702:ERROR:audio_input_processor.cc(756)] Input error
ON_MUTED_CHANGED:
{‘is_muted’: False}
ON_START_FINISHED
ON_ASSISTANT_ERROR:
{‘is_fatal’: True}
[7689:7704:ERROR:audio_input_processor.cc(756)] Input error
ON_ASSISTANT_ERROR:
{‘is_fatal’: True}

Исправлено: НЕ запускайте как sudo

Если gassist.sh выдает ошибку о RPi.GPIO, вам нужно сделать https://youtu.be/ohUszBxuQA4?t=580 :

$ cd /home/pi/env/bin
$ source activate
(env) $ pip install RPi.GPIO
(env) $ deactivate

А потом я сделал sudo nano /etc/profile и добавил это в конец:

#Harvs was here on 24/06/17
if pidof -x "gassist.sh" >/dev/null; then
    echo ""
    echo "/etc/profile says:"
    echo "An instance of Google Assistant is already running, will not start again"
    echo ""
else
    echo "Starting Google Assistant..."
    echo "If you are seeing this, perhaps you have SSH within seconds of reboot"
    /home/pi/src/gassist.sh &
fi

И теперь он отлично работает, и внутри виртуальной среды, и в режиме загрузки в CLI! :)

person Harvs    schedule 24.06.2017