ImportError: нет модуля с именем «расписание», когда я использую систему для запуска службы

Я написал скрипт под названием coinview.py, и он может работать на линукс. Когда я пытаюсь запустить его как systemd, возникает ошибка

error:ImportError: No module named 'schedule'.

Я использую pip3 расписание показов, оно уже есть. Так что я понятия не имею, что не так с моим сценарием.

Я печатаю sys.executable и sys.path в systemd.

[Unit]
Description=coinview deamon
After=rc-local.service

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/ubuntu/source/quotation_api
ExecStart=/usr/bin/python3 coinview.py
Restart=always

[Install]
WantedBy=multi-user.target
ubuntu@ip-100-00-40-02:/etc/systemd/system$ pip3 show schedule
Name: schedule
Version: 0.6.0
Summary: Job scheduling for humans.
Home-page: https://github.com/dbader/schedule
Author: Daniel Bader
Author-email: [email protected]
License: MIT
Location: /home/ubuntu/.local/lib/python3.5/site-packages
Requires: 
Required-by: 

Mar 27 08:40:10 ip-100-00-40-02 python3[8634]: Traceback (most recent call last):
Mar 27 08:40:10 ip-100-00-40-02 python3[8634]:   File "coinview.py", line 3, in <module>
Mar 27 08:40:10 ip-100-00-40-02 python3[8634]:     import requests,threading,time,schedule,json
Mar 27 08:40:10 ip-100-00-40-02 python3[8634]: ImportError: No module named 'schedule'
Mar 27 08:40:10 ip-100-00-40-02 systemd[1]: coinview.service: Main process exited, code=exited, status=1/FAILURE
Mar 27 08:40:10 ip-100-00-40-02 systemd[1]: coinview.service: Unit entered failed state.
Mar 27 08:40:10 ip-100-00-40-02 systemd[1]: coinview.service: Failed with result 'exit-code'.
Mar 27 08:40:10 ip-100-00-40-02 systemd[1]: coinview.service: Service hold-off time over, scheduling restart.
Mar 27 08:40:10 ip-100-00-40-02 systemd[1]: Stopped coinview deamon.
Apr 09 07:59:03 ip-100-00-40-02 python[12095]: /usr/bin/python3
Apr 09 07:59:03 ip-100-00-40-02 python[12095]:  ['/home/ubuntu/source/quotation_api', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x8

Вы пробовали pip install schedule в командной строке?

Jan 09.04.2019 09:38

Можете показать, что есть у sys.path? Попробуйте создать фиктивное исключение с его значением, чтобы показать его в журнале запуска службы.

andreihondrari 09.04.2019 09:41

Конечно, результат — Требование уже выполнено.

Orz Han 09.04.2019 09:42
systemd вероятно использует системную python сторону для запуска скрипта. Вы можете проверить это, запустив что-то вроде import sys; print(sys.executable) в верхней части скрипта и сохранив вывод, созданный systemd
Arne 09.04.2019 09:43

В том же духе вы можете добавить #!/usr/bin/python3 вверху файла, чтобы предложить любому процессу, который просто пытается запустить файл как исполняемый файл, использовать python3 для его запуска. Этот шебанг должен указывать на интерпретатор Python, у которого в боковых пакетах установлен модуль schedule, который, вероятно, является python3 в /usr/bin, но кто знает.

Arne 09.04.2019 09:46

>>> import sys >>> sys.path ['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64 -linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/ubuntu/.local/lib/python3.5/site-packages', '/usr/local/lib/python3 .5/dist-пакеты', '/usr/lib/python3/dist-пакеты']

Orz Han 09.04.2019 09:46

@OrzHan, очень важно, чтобы вы печатали sys.path из службы, а не из ручной оболочки. Причина в том, что я предполагаю, что ваша среда в службе может отличаться от той, которую вы ожидаете.

andreihondrari 09.04.2019 09:49

@Arne print(sys.executable) - это /usr/bin/python , и я добавляю #!/usr/bin/python3 вверху моего файла, но это не работает

Orz Han 09.04.2019 10:03

@andreihondrari я печатаю sys.path как systemd, ['/home/ubuntu/source/quotation_api', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu ', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr /local/lib/python2.7/ди

Orz Han 09.04.2019 10:05

@OrzHan, очевидно, что в systemd вы используете python2.7, в котором, вероятно, не установлен пакет schedule.

andreihondrari 09.04.2019 10:06

@andreihondrari О, но как я могу это изменить?

Orz Han 09.04.2019 10:08

Мой скрипт был написан ExecStart=/usr/bin/python3 coinview.py, но systemd все еще выполняет мой файл с python2.7, почему?

Orz Han 09.04.2019 10:14

Кстати, проверьте правильность написания демон.

tripleee 25.05.2021 10:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
13
14 963
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Установите пакет для root с помощью

sudo pip install schedule

Или вместо того, чтобы запускать его от имени пользователя root, попробуйте запустить его от имени другого конкретного пользователя. Измените свой .service на что-то вроде:

[Unit]
Description=coinview deamon
After=rc-local.service

[Service]
Type=simple
User=user
WorkingDirectory=/home/ubuntu/source/quotation_api
ExecStart=/usr/bin/python3 coinview.py
Restart=always

[Install]
WantedBy=multi-user.target

Надеюсь, это поможет!

Надеюсь, вы использовали конкретное имя пользователя, а не буквально «Пользователь = пользователь». Если да, то это та же ошибка или другая?

RKalra 09.04.2019 10:46

Может быть, если вы измените его на ExecStart=/home/ubuntu/.local/bin/python3.5 coinview.py?

Arne 09.04.2019 14:17

только что установил пакет с рутом, решил мою проблему. Спасибо друг

laughing 31.12.2020 12:22
Ответ принят как подходящий

Согласно этим журналам, я обнаружил, что PYTHONPATH отличается в ручной оболочке и systemd. И я пытаюсь добавить «/home/ubuntu/.local/lib/python3.5/site-packages» в /etc/profile, но журналы systemd показать, что он все еще не может найти путь.

Так что я делаю тупую вещь, добавляю

sys.path.append("/home/ubuntu/.local/lib/python3.5/site-packages") 

в моем коде, и он работает...

Другие вопросы по теме