Django. Программа при запуске через manage.py не использует виртуальное окружение
Пишу бота для телеграмма и использованием Django. Бот запускается через файл tg_bot/management/commands/bot.py. При запуске команды через manage.py скрипт не видит виртуальную среду и выводит сообщение, что модуль не найден.
`Traceback (most recent call last):
File "C:\Users\ivan\Documents\vs_code\eleshop\tg_bot_shop\tg_bot\bot.py", line 1, in <module>
from utils import *
File "C:\Users\ivan\Documents\vs_code\eleshop\tg_bot_shop\tg_bot\utils.py", line 10, in <module>
from telegram import InputMediaPhoto
ModuleNotFoundError: No module named 'telegram'`
При этом, если запустить бота напрямую, то он работает нормально. Виртуальное окружение активировано. Использую VS Code. Изначально писал на Linux, и там всё работало нормально. Сейчас использую Windows и появилась эта проблема. python manage.py runserver работает нормально.
sys.path выводит ['C:\\Users\\ivan\\Documents\\vs_code\\eleshop\\tg_bot_shop\\tg_bot', 'C:\\Users\\ivan\\AppData\\Local\\Programs\\Python\\Python311\\python311.zip', 'C:\\Users\\ivan\\AppData\\Local\\Programs\\Python\\Python311\\Lib', 'C:\\Users\\ivan\\AppData\\Local\\Programs\\Python\\Python311\\DLLs', 'C:\\Users\\ivan\\AppData\\Local\\Programs\\Python\\Python311', 'C:\\Users\\ivan\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages']
- здесь указано где python установлен глобально.
Пробовал переустановить Python и VS Code и его расширения. Сейчас в качестве костыля использую
import sys
import os
def setup_core_dir():
core_dir = os.path.dirname(os.path.dirname(__file__))
sys.path.append(core_dir)
sys.path.append(os.path.join(core_dir, 'venv', 'Lib', 'site-packages'))
print(sys.path)
setup_core_dir()
Файл команды запуска (через manage.py): run_bot.py
from django.core.management.base import BaseCommand
import subprocess
class Command(BaseCommand):
help = 'Запуск бота'
def handle(self, *args, **options):
path_to_bot = 'tg_bot/bot.py'
subprocess.run(['python', path_to_bot])
Проблема была в запускающем скрипте. В нем использовалась команда python, что видимо указывало на использование глобального окружения. Заменил её на sys.executable, который указывает абсолютный путь к интерпретатору через который был запущен скрипт.
from django.core.management.base import BaseCommand
import subprocess
import sys
import os
class Command(BaseCommand):
help = 'Запуск бота'
def handle(self, *args, **options):
path_to_bot = os.path.join('tg_bot', 'bot.py')
path_to_python = sys.executable
subprocess.run([path_to_python, path_to_bot])