Задать вопрос
Ответы пользователя по тегу Python
  • Как сделать скачивание файла с github релиза на python?

    @eminsk
    developer python, javascripts
    Проблема в том, что GitHub автоматически перенаправляет запросы к файлам в релизах, а библиотека requests по умолчанию не следует перенаправлениям при использовании stream=True. Также GitHub требует правильные заголовки для скачивания файлов.

    Данный код корректно все нормально делает без ошибок и скачивает в папку где запущен мой скрипт.
    если папка download нету она создается автоматически.
    А также сделал со всеми проверками в коде
    Установи не забудь только requests
    import os
    import requests
    from urllib.parse import urlparse
    
    def versionDownload(url, folder, chunk_size=8192):
        if not os.path.exists(folder):
            os.makedirs(folder, exist_ok=True)
        
        if "github.com" in url and "/releases/" in url and "/download/" not in url:
            print("Обнаружена ссылка на страницу релиза. Попытка найти правильную ссылку...")
            page_response = requests.get(url)
            page_response.raise_for_status()
            
            import re
            download_links = re.findall(r'href="([^"]*\/download\/[^"]*)"', page_response.text)
            
            if download_links:
                url = "https://github.com" + download_links[0] if download_links[0].startswith('/') else download_links[0]
                print(f"Найдена ссылка для скачивания: {url}")
            else:
                print("Не удалось найти файлы для скачивания на странице релиза")
                return None
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept': 'application/octet-stream'
        }
        
        print(f"Начался процесс скачивания с URL: {url}")
        
        with requests.get(url, headers=headers, stream=True, allow_redirects=True) as r:
            r.raise_for_status()
            
            content_type = r.headers.get('Content-Type', '')
            if 'text/html' in content_type:
                print("Ошибка: получен HTML вместо файла!")
                print(f"Content-Type: {content_type}")
                print("Проверьте правильность URL")
                return None
            
            filename = "engine.zip"
            if 'Content-Disposition' in r.headers:
                content_disp = r.headers['Content-Disposition']
                if 'filename=' in content_disp:
                    filename = content_disp.split('filename=')[1].strip('"')
            else:
                parsed_url = urlparse(url)
                if parsed_url.path:
                    filename = os.path.basename(parsed_url.path) or "engine.zip"
            
            file_path = os.path.join(folder, filename)
            
            total_size = int(r.headers.get('Content-Length', 0))
            downloaded_size = 0
            
            print(f"Скачивание {filename}...")
            if total_size > 0:
                print(f"Размер файла: {total_size / (1024*1024):.2f} MB")
            
            with open(file_path, 'wb') as f:
                for chunk in r.iter_content(chunk_size=chunk_size):
                    if chunk:
                        f.write(chunk)
                        downloaded_size += len(chunk)
                        
                        if total_size > 0:
                            progress = (downloaded_size / total_size) * 100
                            print(f"\rПрогресс: {progress:.1f}% ({downloaded_size / (1024*1024):.2f} MB)", end='', flush=True)
            
            print(f"\nФайл успешно скачан: {file_path}")
            return file_path
    
    if __name__ == "__main__":
        url = "https://github.com/artyom7774/Game-Engine-3/releases/download/GE3.12.0/Game-Engine-3-windows.sfx.exe"
        versionDownload(url, "./downloads")
    Ответ написан
    Комментировать
  • Как исправить отображение в игре?

    @eminsk
    developer python, javascripts
    Тебе в функции painting после строки current_rad = float(new_rad)

    нужно добавить дополнительную проверку:
    if current_rad >= 190:
                radius_mult = 2.0
            else:
                radius_mult = 1.0
    Ответ написан
    Комментировать
  • Не работает inline кнопка telebot?

    @eminsk
    developer python, javascripts
    Я пробывал в твоем коде через telebot и да тоже не реагирует не как и я тебе переделал на aiogram и все заработало.
    Ну а дальше уже сам реализовывай все остальные свои задачи.
    Работоспособность проверялась на последней версии на дату публикации python 3.13
    from __future__ import annotations
    import logging
    import os
    import shelve
    from datetime import datetime, timedelta
    from pathlib import Path
    
    from aiogram import Bot, Dispatcher, F
    from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
    from aiogram.filters import Command
    from aiogram.utils.keyboard import InlineKeyboardBuilder
    from aiogram.fsm.storage.memory import MemoryStorage
    from aiogram.client.default import DefaultBotProperties
    
    # Configure logging
    logging.basicConfig(level=logging.INFO)
    
    # Constants
    TRIAL_FLAG = "active"
    
    class UltraLiteSubBot:
        __slots__ = ("_bot", "_dp", "_prices", "_db", "_cmd_map", "_cb_map")
        def __init__(self, token: str, prices: dict[str, int], db: shelve.DbfilenameShelf):
            self._bot = Bot(token=token, default=DefaultBotProperties(parse_mode="HTML"))
            self._dp = Dispatcher(storage=MemoryStorage())
            self._prices = prices
            self._db = db
            self._cmd_map = {
                "start": self._show,
                "help": self._help
            }
            
            self._cb_map = {
                **{plan: self._plan(plan) for plan in prices},
                "activate": self._activate
            }
            self._register_handlers()
    
        def _register_handlers(self) -> None:
            self._dp.message.register(self._show, Command("start"))
            self._dp.message.register(self._help, Command("help"))
            self._dp.message.register(self._unknown)
            for plan in self._prices:
                self._dp.callback_query.register(self._plan(plan), F.data == plan)
            self._dp.callback_query.register(self._activate, F.data == "activate")
            self._dp.callback_query.register(self._unknown_callback)
    
        async def run(self) -> None:
            await self._bot.set_my_commands([
                {"command": "start", "description": "Выбрать тариф"},
                {"command": "help", "description": "Справка"}
            ])
            await self._dp.start_polling(self._bot)
        async def _show(self, msg: Message) -> None:
            uid = msg.chat.id
            builder = InlineKeyboardBuilder()
            for plan, price in self._prices.items():
                builder.button(text=f"{plan.title()} — {price}₽", callback_data=plan)
            if await self._trial_ok(uid):
                builder.button(text="Активировать пробный период", callback_data="activate")
            builder.adjust(1)
            await msg.answer("Выберите тариф:", reply_markup=builder.as_markup())
    
        async def _help(self, msg: Message) -> None:
            await msg.answer("/start — выбрать тариф\n/help — справка")
    
        async def _unknown(self, msg: Message) -> None:
            await msg.answer("Неизвестная команда. /help")
    
        async def _unknown_callback(self, call: CallbackQuery) -> None:
            await call.answer()
            await call.message.answer("Неизвестная операция.")
    
        def _plan(self, name: str):
            async def _handler(call: CallbackQuery) -> None:
                await call.answer()
                await call.message.answer(f"Вы выбрали тариф «{name}».")
            return _handler
    
        async def _activate(self, call: CallbackQuery) -> None:
            await call.answer()
            uid = str(call.from_user.id)
            try:
                self._db[uid] = {
                    "started": datetime.utcnow(),
                    TRIAL_FLAG: True,
                    "questions": 0,
                    "symbols": 0,
                }
                self._db.sync()
            except Exception as e:
                await call.message.answer(f"⚠️ Ошибка БД: {e}")
                return
    
            await call.message.answer(
                "✅ Пробный период активирован!\nДоступно: 10 вопросов / 10 000 символов"
            )
            
            try:
                await call.message.edit_reply_markup(reply_markup=None)
            except Exception:
                pass
    
        async def _trial_ok(self, uid: int) -> bool:
            rec = self._db.get(str(uid), {})
            return not rec.get(TRIAL_FLAG) or datetime.utcnow() - rec.get("started", datetime.min) >= timedelta(days=7)
    
    
    async def main():
        TOKEN = os.getenv("BOT_TOKEN", "вставь свой токен сюда")
        PRICES = {"month": 199, "quarter": 549, "year": 1_490}
        db = shelve.open(str(Path(__file__).with_name("trial.db")), writeback=True)
        db.update({k: v | {TRIAL_FLAG: v.get(TRIAL_FLAG, False)} for k, v in db.items()})
        bot = UltraLiteSubBot(TOKEN, PRICES, db)
        await bot.run()
    
    
    if __name__ == "__main__":
        import asyncio
        asyncio.run(main())
    Ответ написан
    Комментировать
  • Нахождение значения в фрейме(или столбце) и при его нахождении добавить дополнительные строки. Как реализовать код в Pandas (Python)?

    @eminsk
    developer python, javascripts
    import pandas as pd
    df = pd.DataFrame({'Name': ['car1', 'car2', 'car3', 'car4'], 'Type': [20, 21, 19, 18], 'Repair': ["n", "n", "y", "n"]})
    def add_bit_rows(df):
        y_rows = df[df['Repair'] == 'y']
        bit_rows = [
            {
                'Name': row['Name'],
                'Type': row['Type'],
                'Repair': f"y_bit{i}"
            }
            for _, row in y_rows.iterrows()
            for i in range(16)
        ]
        df_bits = pd.DataFrame(bit_rows)
        return pd.concat([df, df_bits], ignore_index=True)
    print(add_bit_rows(df))
    Ответ написан
    Комментировать
  • Почему Python выдает ошибку в строке с newPosition?

    @eminsk
    developer python, javascripts
    Походу пока еще не до конца освоил как правильно писать однострочные коды.
    И всегда обязательно делай проверку на ошибку в коде и отладку кода

    alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    
    caesar_cipher = lambda text, key: ''.join(
            alphabet[(alphabet.find(letter) + key) % len(alphabet)] if letter in alphabet else letter
            for letter in text
        )
    encrypt = input('Введите слово, которое хотите зашифровать: ')
    try:
        encrypted = caesar_cipher(encrypt, int(input('Введите ключ (от 1 до 32): ')))
        print(f'Зашифрованное слово: {encrypted}')
    except ValueError:
        print('Ошибка: ключ должен быть числом.')
    Ответ написан
    Комментировать
  • Что делать, если не скачивается видео из youtube (yt_dlp)?

    @eminsk
    developer python, javascripts
    зачем тебе даже python просто скачай с официального сайта
    https://github.com/yt-dlp/yt-dlp/releases/download...

    и просто запусти yt-dlp -f bestvideo+bestaudio/best и твоя ссылка youtube
    не забывай еще скачать ffmpeg.exe
    и обновлять yt-dlp -U для выхода новых версий и все
    Тебе даже python не подобится так как скомпилировали для тебя
    Ответ написан
    4 комментария
  • Каков должен быть sys.path у чистого Python 3.1x под Windows?

    @eminsk
    developer python, javascripts
    В Windows 7 ты не как не запустишь python 3.12 и не выше 3.8
    Windows 8.x тут версии python 3.9-3.11 но не как python 3.12
    Windows XP тут версии python 3.x-3.4 и выше нельзя

    Реализация на windows 7 в твоем случае

    Python 3.8.19 (default, Mar 20 2024, 11:17:09) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print('\n'.join(__import__('sys').path))
    
    D:\Python38\python38.zip
    D:\Python38\DLLs
    D:\Python38\lib
    D:\Python38
    D:\Python38\lib\site-packages
    Ответ написан
    Комментировать
  • Не получается записать в файл?

    @eminsk
    developer python, javascripts
    Тебе функцию save_data лучше переделать в такой вид:
    def save_data(data):
        try:
            with open("reminders.json", "w", encoding="utf-8") as f:
                json.dump(data, f, ensure_ascii=False, indent=4)
        except IOError as e:
            print(f"Error writing to file: {e}")
    Ответ написан
    Комментировать
  • Как закрыты зависшие терминалы Python в Windows 11 Pro?

    @eminsk
    developer python, javascripts
    import os
    import signal
    os.kill(os.getpid(), signal.SIGTERM)
    Ответ написан
    Комментировать
  • Как сделать регулярное выражение для отсеивания знаков/символов/английских букв (Python)?

    @eminsk
    developer python, javascripts
    Я тебе сделал с помощью универсальной анонимной функцией, чтобы было пользоваться многократно в своем коде:
    filter_chars = lambda pattern, text: __import__('re').findall(pattern, text)
    pattern = r"[^а-яА-ЯёЁa-zA-Z]" # паттерн для поиска отсеянных символов - или какие символы ты хочешь отсеить
    text = "Добро пожаловать в Python! 1234567890 @#$%^&*()_+=-" # текст для поиска
    print("Отсеянные символы:", filter_chars(pattern, text))

    pattern в этой переменной тебе нужно прописать что нужно отсеивать. В своем коде я добавил русский и
    английский текст.
    только английские большие и маленькие буквы
    pattern = r"[^a-zA-Z]"
    Можно добавить еще символы
    для спецсимволов будет строка содержать уже:
    pattern = r"[@#$%^&*()_+=-]"
    Чтобы собрать все символы в 1 строку:
    print("Собрано все символы в строку:", ''.join(filter_chars(pattern, text)))


    Результат выполнения программы для первого pattern, который вместе с функцией и собрать все символы
    662286302b52b387781806.png
    Ответ написан
    Комментировать
  • Python (3.4.3) pip на win7 не может установить соединение, почему?

    @eminsk
    developer python, javascripts
    Лучше всего удали устаревший python 3.4 для windows 7 и поставь последнюю версию python для этой системы 3.8. В более старом python куча ошибок.
    Ответ написан
    Комментировать