Автозапуск скрипта Python в Linux
Обновлено: 21.11.2024
Обычно, если вы запускаете программу на Python либо из режима ожидания, либо из прямой команды из окна терминала, любой вывод программы отображается в окне терминала. Однако, если я запускаю программу при загрузке, вывод программы не виден. Я искал высоко и низко, но не могу найти способ идеального автозапуска программы при загрузке, НО также вывод ее на печать в окне терминала. Таким образом, я могу видеть результат различных операторов печати во время работы программы. Я уверен, что здесь должно быть что-то простое, чего мне не хватает. Есть предложения?
Стоит ли зацикливаться на автоматически запускаемых скриптах Python, поскольку они всплывают почти каждый день?
Привет, Дэйв! Не уверен, что мой пост действительно посвящен автозапуску скриптов. Я использовал systemd для настройки автозапуска при загрузке pi, но хотел найти способ запустить их в видимом окне терминала, чтобы я мог видеть их вывод и, возможно, даже использовать CTRL C, если мне это нужно. р>
Я думаю, что кто-то уже дал правильный ответ где-то выше.
Если вы хотите, чтобы он работал на X/Gui/Desktop, вы должны поместить свою команду в один из файлов в .config. Таким образом, он будет запущен как часть запуска X/Gui/Desktop.
Но одна деталь, которая отсутствует, заключается в том, что вам может потребоваться запустить его с помощью чего-то вроде "xterm -e yourfile.py".
(следует обзор уже известных вещей)
Есть в основном 3 ответвления на этот общий вопрос:
1) Как автоматически запускать вещи при загрузке. Это хорошо прикрыто, и, кажется, у вас все под контролем.
2) Как запустить его как часть запуска X (т. е. ваша программа не должна запускаться до тех пор, пока рабочий стол X не будет запущен и не начнет принимать клиентов). Опять же, ответ на это вверх.
3) Как запускать программы в текстовом режиме в xterm (т.е. хак "xterm -e"). Это та часть, которая, возможно, до сих пор отсутствовала в обсуждении.
Спасибо за помощь, но где-то я что-то упускаю. Я пробовал различные сценарии в сообщениях, упомянутых в этой и других ветках, но не могу сделать это правильно. Итак, вот моя проблема:
Я запускаю 4 отдельных скрипта Python при загрузке с помощью systemd. В этом примере показан один из сценариев Systemd, хранящихся в /lib/systemd/system с именем файла door_bell_vclock.service. Другие сценарии запуска в основном такие же, только с другими именами программ.
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin /python3 /home/pi/progs/chbn/door_bell_vclock.py
[Установить]
WantedBy=multi-user.target
Это работает правильно, когда пи загружается, но я не могу заставить работать скрипт python, чтобы он отображался в окне терминала, чтобы я мог видеть его вывод. Очевидно, я бы хотел, чтобы каждый из 4 сценариев появлялся в своем окне. Возможно, я упускаю из виду упомянутый «xterm -e hack»? Или я просто упускаю очевидное?
DougieLawson Сообщений: 42008 Присоединился: вс, 16 июня 2013 г., 23:19. Местоположение: A small cave in the deepest darkest Basingstoke, UK Контакт: веб-сайт Twitter
Вы не можете запускать элементы графического интерфейса из служебных файлов systemd. Запустите их из файла автозапуска в /home/pi/.config/lxsession/LXDE-pi/autostart или /home/pi/.config/autostart
Языки, использующие левые пробелы для синтаксиса, нелепы
Ответы на личные сообщения, отправленные в Twitter/LinkedIn, будут получены в следующем месяце.
Фальшивые врачи - все в списке моих врагов.
Пример программы
Вы можете использовать любую программу, которую хотите запускать при загрузке; для этого урока мы используем пример программы Python, которая будет говорить при запуске Raspberry Pi. Этот пример программы будет использовать пакет Espeak, чтобы заставить Raspberry Pi произнести фразу «Добро пожаловать в мир роботов».
Если у вас не установлен пакет Espeak, запустите в терминале следующую команду для установки:
В каталоге /home/pi откройте файл для редактирования:
И введите следующий код и сохраните его (нажмите CTRL+X и введите Y ).
Способ 1: rc.local
Первый способ запустить программу на Raspberry Pi при запуске — использовать файл rc.local. Чтобы запустить команду или программу при загрузке Pi, вы можете добавить команды в файл rc.local. Это особенно полезно, если вы хотите включить Pi в безголовом режиме (то есть без подключенного монитора) и запустить программу без настройки или ручного запуска.
Редактирование rc.local
На своем Pi отредактируйте файл /etc/rc.local с помощью редактора по вашему выбору. Вы должны редактировать его с правами суперпользователя:
Добавьте команды для выполнения программы Python, предпочтительно используя абсолютную ссылку на местоположение файла (предпочтительнее полный путь к файлу). Обязательно оставьте строку exit 0 в конце, затем сохраните файл и выйдите. В nano для выхода нажмите Ctrl-x, а затем Y.
Если ваша программа работает непрерывно (выполняет бесконечный цикл) или, скорее всего, не завершится, вы должны обязательно разветвить процесс, добавив амперсанд ("&") в конец команды, например:
Pi запустит эту программу при загрузке и до запуска других служб. Если вы не включаете амперсанд и если ваша программа работает непрерывно, Pi не завершит процесс загрузки. Амперсанд позволяет команде выполняться в отдельном процессе и продолжать загрузку с работающим основным процессом.
Теперь перезагрузите Pi, чтобы проверить его:
Советы
Кроме того, обязательно указывайте абсолютные имена файлов, а не относительные к вашей домашней папке. Например, используйте `/home/pi/myscript.py` вместо `myscript.py`.
Если вы добавите сценарий в /etc/rc.local, он будет добавлен в последовательность загрузки. Если ваш код зависает, последовательность загрузки не может быть продолжена. Поэтому будьте осторожны с тем, какой код вы пытаетесь запустить при загрузке, и проверьте код пару раз. Вы также можете записать выходные данные скрипта и ошибки в текстовый файл (скажем, log.txt) и использовать его для отладки.
Способ 2: .bashrc
Второй способ запустить программу на Raspberry Pi при запуске — изменить файл .bashrc. С помощью метода .bashrc ваша программа python будет запускаться при входе в систему (что происходит автоматически, когда вы загружаетесь и переходите непосредственно на рабочий стол), а также каждый раз, когда открывается новый терминал или когда устанавливается новое соединение SSH. Поместите свою команду в конец «/home/pi/.bashrc». Программу можно прервать с помощью «ctrl-c» во время ее работы!
Перейдите к последней строке скрипта и добавьте:
Приведенный выше оператор echo используется для демонстрации того, что команды в файле .bashrc выполняются при загрузке, а также при подключении к консоли bash.
Теперь перезагрузите Pi, чтобы услышать, как Pi говорит при запуске.
На изображении ниже показано, что команды, добавленные в файл .bashrc, выполняются даже при открытии нового терминала.
Способ 3: каталог init.d
Третий способ запустить программу на Raspberry Pi при запуске — добавить программу (которая будет запускаться при загрузке) в каталог /etc/init.d. Этот каталог содержит сценарии, которые запускаются в процессе загрузки (кроме того, все программы здесь выполняются при завершении работы или перезагрузке системы).
Добавьте программу, которая будет запускаться при запуске, в каталог init.d, используя следующие строки:
Перейдите в каталог инициализации и откройте пример скрипта
Добавьте следующие строки в образец сценария, чтобы сделать его сценарием инициализации Linux Standard Base (LSB) (стандарт структуры программной системы, включая иерархию файловой системы, используемую в операционной системе Linux).
Сценарии init.d требуют документирования вышеуказанных зависимостей времени выполнения, чтобы можно было проверить текущий порядок загрузки, порядок загрузки с использованием этих зависимостей и параллельный запуск сценариев загрузки для ускорения процесса загрузки. р>
Вы можете научиться писать скрипты init.d, следуя этому руководству здесь.
Сделайте пример сценария в каталоге инициализации исполняемым, изменив его разрешение.
Выполните эту команду:
Теперь перезагрузитесь, чтобы услышать, как Pi говорит при запуске.
Метод 4: SYSTEMD
Четвертый способ запустить программу на Raspberry Pi при запуске — использовать файлы systemd. systemd предоставляет стандартный процесс управления тем, какие программы запускаются при загрузке системы Linux. Обратите внимание, что systemd доступен только в версиях Raspbian OS для Jessie.
Шаг 1. Создайте файл модуля
Откройте образец файла модуля с помощью команды, как показано ниже:
Добавить следующий текст:
Вы должны сохранить и выйти из редактора nano.
Это определяет новую службу под названием «Образец службы», и мы просим запустить ее, как только станет доступна многопользовательская среда. Параметр «ExecStart» используется для указания команды, которую мы хотим запустить. «Тип» установлен на «ожидание», чтобы гарантировать, что команда ExecStart запускается только тогда, когда все остальное загружено. Обратите внимание, что пути являются абсолютными и определяют полное расположение Python, а также расположение нашего скрипта Python.
Чтобы сохранить текстовый вывод скрипта в файле журнала, вы можете изменить строку ExecStart на:
Права доступа к файлу модуля должны быть установлены на 644 :
Шаг 2. Настройка systemd
Теперь, когда юнит-файл определен, мы можем указать systemd запустить его во время последовательности загрузки:
Перезагрузите Pi, и ваш пользовательский сервис должен запуститься:
Способ 5: crontab
Подробное руководство по использованию crontab для запуска программы при загрузке можно найти здесь.
Вы можете использовать любой из этих методов для запуска вашей программы при загрузке, если точка, в которой ваш скрипт Python запускается в последовательности запуска, не является жизненно важной. Если ваш сценарий зависит от каких-либо системных функций, доступных в этот момент времени, таких как подключение и доступность сети, каталог /home/pi смонтирован и готов к использованию или системное время было обновлено NTP, тогда он будет идеально подходит для использования методов systemd или init.d. Эти методы управляют моментом загрузки, в котором ваш скрипт выполняется во время загрузки.
Ваше желание — моя команда.
Подробнее
Хотите создать несколько потрясающих проектов с помощью Raspberry Pi и роботов? Собери свой собственный робот-автомобиль GoPiGo! Посетите нашу страницу проектов, чтобы увидеть больше примеров забавных проектов по робототехнике с вашим Raspberry Pi!
Вопросы
Есть вопрос? Нужна помощь? Спросите на нашем форуме!
Подробнее!
Если вам понравился этот урок, подумайте о том, чтобы получить Raspberry Pi здесь и SD-карту с Raspbian для роботов здесь, чтобы попробовать себя.
С последним выпуском Raspbian у меня начались проблемы с автозапуском скриптов Python при загрузке с использованием Cron или rc.local. Похоже, что последовательность загрузки Raspbian изменилась, и эти процессы выполняются в разных точках этой последовательности. Насколько это проблема, зависит от того, что пытается сделать ваш скрипт Python и какие ресурсы ему нужны.
Точка, в которой ваш скрипт Python запускается в последовательности запуска, имеет жизненно важное значение, если ваш скрипт зависит от каких-либо системных функций, доступных в этот момент времени. Для меня это часто включает:
- Сеть подключена и доступна
- Каталог /home/pi смонтирован и прочитан для использования
- Системное время обновлено NTP
Я решил использовать «systemd», так как это рекомендуемый способ запуска пользовательских функций, и многие дистрибутивы Linux используют его. systemd — это программный пакет для централизованного управления и настройки системы Linux, призванный заменить другие популярные инструменты, ранее выполнявшие эту роль. В результате кажется, что у него много врагов, но вы можете прочитать все о полемике на странице systemd в Википедии.
systemd довольно страшный. Или легко. В зависимости от вашего уровня опыта. Моя цель состояла в том, чтобы заставить его запускать один из моих скриптов с минимумом возни и без необходимости слишком много печатать, чего я не понимаю.
Шаг 1. Ваш скрипт Python
Мой скрипт-пример хранился в каталоге /home/pi и назывался «myscript.py». Очевидно, ваш скрипт можно назвать как-то иначе, но следите за тем, где он упоминается в командах и тексте ниже.
Шаг 2. Создайте файл модуля
Далее мы создадим файл конфигурации (также известный как юнит-файл), который сообщает systemd, что мы хотим, чтобы он делал и когда:
Добавить следующий текст:
Вы можете сохранить и выйти из редактора nano, нажав [CTRL-X], [Y], затем [ENTER].
Это определяет новую службу под названием «Моя служба сценариев», и мы запрашиваем ее запуск после того, как станет доступна многопользовательская среда.Параметр «ExecStart» используется для указания команды, которую мы хотим запустить. «Тип» установлен на «ожидание», что гарантирует, что команда ExecStart запускается только тогда, когда все остальное загружено. Для моих сценариев на основе GPIO тип «простой» по умолчанию не работал.
Обратите внимание, что пути являются абсолютными и полностью определяют расположение Python, а также расположение нашего скрипта Python.
Чтобы сохранить текстовый вывод скрипта в файле журнала, вы можете изменить строку ExecStart на:
Права доступа к файлу модуля должны быть установлены на 644 :
Шаг 3. Настройка systemd
Теперь, когда юнит-файл определен, мы можем указать systemd запустить его во время последовательности загрузки:
Возможность включать скрипты Python в blend-файлы полезна для сложных задач, таких как риггинг и автоматизация. Однако это представляет угрозу безопасности, поскольку Python не ограничивает возможности сценария. Поэтому вам следует запускать сценарии только из источников, которые вы знаете и которым доверяете. Автоматическое выполнение по умолчанию отключено, однако для правильной работы некоторых blend-файлов это необходимо.
Когда blend-файл пытается выполнить скрипт и ему это не разрешено, появляется диалоговое окно. В нем вы можете выбрать Разрешить выполнение или Игнорировать сценарии.
Предупреждение об автозапуске в заголовке информационного редактора.
Скрипты в Blend-файлах
Автоматическое выполнение
Вот различные способы, которыми blend-файлы могут автоматически запускать скрипты.
У текстового блока данных может быть включена опция Регистрация, что означает, что он будет загружаться при запуске.
Выражения Python могут использоваться для управления значениями и часто используются в более сложных ригах и анимациях.
Выполнение вручную
Существуют и другие способы выполнения сценариев в blend-файле, которые требуют взаимодействия с пользователем (таким образом, они будут выполняться, даже если автоматическое выполнение отключено), но вы должны знать, что это так, поскольку это не всегда очевидно. р>
Запуск сценария в текстовом редакторе.
Визуализация с помощью Freestyle, поскольку Freestyle использует скрипты для управления стилями линий.
Управление выполнением скрипта
Blender предоставляет несколько способов управления автоматическим выполнением скриптов из blend-файла.
Во-первых, в файловом браузере есть параметр "Надежный источник", который можно использовать в каждом конкретном случае для управления автоматическим выполнением. Однако вы можете забыть установить это или открыть файл, не заходя в браузер файлов, поэтому вы можете изменить значение по умолчанию (описано далее).
Настройка значений по умолчанию
В настройках есть переключатель для автоматического запуска скриптов Python. Это означает, что опция Trusted Source в File Browser будет включена по умолчанию, и сценарии могут запускаться при загрузке blend-файлов без использования File Browser. После включения у вас есть возможность исключить определенные каталоги, типичная конфигурация будет заключаться в том, чтобы доверять всем путям, кроме каталога загрузки.
Флажок Автозапуск скриптов Python.
Командная строка
Возможно, вы захотите выполнить пакетный рендеринг или какую-либо другую задачу из командной строки, запустив Blender без интерфейса. В этом случае настройки по-прежнему используются, но вы можете переопределить их:
Включить с помощью -y или --enable-autoexec
Отключить с помощью -Y или --disable-autoexec
Пример
Визуализация анимации в фоновом режиме, позволяющая запускать драйверы и другие сценарии:
Эти аргументы командной строки можно использовать для запуска обычного экземпляра Blender, и они по-прежнему будут переопределять настройки.
© Copyright: Эта страница находится под лицензией CC-BY-SA 4.0 Int. Лицензия. Последнее обновление: 21 марта 2022 г.
Читайте также: