Проблема с путями в python

Стркутура моего проекта следующая

.
├── ./app
│   ├── ./app/config.py
│   ├── ./app/coub.service
│   ├── ./app/drivers
│   │   └── ./app/drivers/chromedriver
│   ├── ./app/headers
│   │   └── ./app/headers/user-agent.txt
│   ├── ./app/main.py

В файле config.py находится несколько строк с переменными для useragent и chromedriver

# Пользовательский агент
PATH_HEADERS = Path(Path.cwd(), 'headers', 'user-agent.txt')
USERAGENT = choice(open(f'{PATH_HEADERS}').read().split("\n")) if os.path.isfile(f'{PATH_HEADERS}') else 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
# cromedriver
PATH_DRIVERS = Path(Path.cwd(), 'drivers', 'chromedriver')
DRIVERS = PATH_DRIVERS if os.path.isfile(f'{PATH_DRIVERS}') else os.path.abspath('/media/hdd/Project/Coub-Assistant-Telegram-bot/app/drivers/chromedriver')

При запуске проекта из директории проекта, проект запускается и работает

(env) nonadminus@debian:/media/hdd/Project/Coub-Assistant-Telegram-bot/app$ python3.6 main.py 
Connection pool of Request object is smaller than optimal value (8)
******************************

Но как только я начинаю использовать сервис systemd командой

service coub start

У меня возникает ошибка

Jun 22 10:34:28 debian python3.6[13062]:   (unknown error: DevToolsActivePort file doesn't exist)
Jun 22 10:34:28 debian python3.6[13062]:   (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

Содержимое coub.service

[Unit]
Description=Instance to Coub Assistant Telegram bot
After=network.target

[Service]
WorkingDirectory=/media/hdd/Project/Coub-Assistant-Telegram-bot/app
Environment="PATH=/media/hdd/Project/Coub-Assistant-Telegram-bot/env/bin"
ExecStart=/media/hdd/Project/Coub-Assistant-Telegram-bot/env/bin/python3.6 main.py
Type=simple
User=root

[Install]
WantedBy=multi-user.target

Я предполагаю что это происходит из-за неправильных путей в config.py

Помогите разобраться пожалуйста. Хочется чтобы мой бот работал независимо от того где он будет запущен


Ответы (1 шт):

Автор решения: alex
Path.cwd()

Возвращает путь откуда был запущен интерпретатор. Когда ты запускаешь скрипт как сервис, то путь уже не тот который ты ожидаешь. Пэтому BASE_DIR тебе нужно получить из переменной __file__ которая будет содержать полный путь до текущего файла.

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent

# Пользовательский агент
PATH_HEADERS = BASE_DIR / 'headers' / 'user-agent.txt'
USERAGENT = choice(PATH_HEADERS.read_text().split("\n")) if PATH_HEADERS.is_file() else 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
# cromedriver
PATH_DRIVERS = BASE_DIR / 'drivers' / 'chromedriver'
DRIVERS = PATH_DRIVERS if PATH_DRIVERS.is_file() else os.path.abspath('/media/hdd/Project/Coub-Assistant-Telegram-bot/app/drivers/chromedriver')

UPD. хром не хочет запускаться из под рута в целях безопасности. Для игнорирования этого требуется добавить опцию запуска --no-sandbox.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--no-sandbox")
browser = webdriver.Chrome(options=chrome_options)
→ Ссылка