Проблема с путями в 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 шт):
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)