Задать вопрос
  • Как выбрать устройство вывода в audiere в C++?

    @eminsk
    программирую на python
    Тут только только часть кода которая показывает, как выбрать устройство вывода не по умолчанию в Audiere без написания каких-либо циклов for или разветвлений if. Я решил сделать это через <алгоритм> из STL

    #include <audiere.h>
    #include <vector>
    #include <string>
    #include <algorithm>
    
    #ifdef _WIN32
    #include <objbase.h>
    #endif
    
    int main() {
    #ifdef _WIN32
      CoInitialize(nullptr);
    #endif
      std::vector<audiere::AudioDeviceDesc> devices;
      devices.reserve(8); 
      audiere::GetSupportedAudioDevices(devices); 
      auto it = std::find_if(
        devices.begin(), devices.end(),
        [](auto const& desc){ return desc.name == "MyDesiredDeviceName"; }
      );
      audiere::AudioDevicePtr device(
        audiere::OpenDevice(
          it != devices.end() ? it->name.c_str() : nullptr,
          /* parameters = */ nullptr
        )
      );
    
      if (!device) {
        // Реализуй свою уже логику обработки ошибок...
        return -1;
      }
      auto sound = audiere::OpenSound(device, "music.ogg", true);
      sound->play();
    
      // ... Далее уже реализуй свою логику программы ...
    
      return 0;
    }
    Ответ написан
    Комментировать
  • Как создать .session с помощью состояния state aiogram 2.25.1?

    @eminsk
    программирую на python
    aiogram 2.25.1 на этой версии уже не реализуешь просто она уже считается устаревшей и телеграмм будет работать с ошибками так как API телеграмм постоянно совершествуются.

    Я уже все переделал сделал на своих данных и все выверил. У меня уже не выскакивает эта ошибка. Проверял все на Python 3.13 и последних версиях библиотеки.
    все версии у меня библиотек там все есть на гите.

    мой код скачай https://github.com/eminsk/fix_problems_telegrambot
    в диапозитарии я не выкладывал файл свои данные а там только тестовые чтобы видеть формат записи - config.ini

    В будушем если будут проблемы создавай Pull requests если что тебе нужно потом в будущем.
    Ответ написан
    Комментировать
  • Не работает inline кнопка telebot?

    @eminsk
    программирую на python
    Я пробывал в твоем коде через 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())
    Ответ написан
    Комментировать
  • Тkinter, после сборки pyinstaller не видит файл иконки, ошибка: bitmap "icon.ico" not defined. Как исправить?

    @eminsk
    программирую на python
    Проблема в том, что когда ты компилируешь приложение в один файл (--onefile), все ресурсы упаковываются внутрь исполняемого файла и извлекаются во временную директорию во время выполнения. Путь к файлу иконки уже не соответствует тому, что был в исходном проекте.
    Используй относительные пути с правильным флагом --add-data

    pyinstaller --name Analyzer --icon=icon.ico --add-data "icon.ico;." --noconsole --onefile main.py


    теперь твоя иконка будет добавлена в сам твой файл уже
    Лично таких проблем как у тебя не было у меня.

    И чтобы бы ты представлял правильность кода:
    import os
    import sys
    import tkinter as tk
    from PIL import Image, ImageTk
    
    class AppResources:
        def __init__(self, relative_path: str):
            self.relative_path = relative_path
            self.base_path = self._get_base_path()
            self.absolute_path = self._get_absolute_path()
        
        def _get_base_path(self) -> str:
            return sys._MEIPASS if hasattr(sys, '_MEIPASS') else os.path.abspath(".")
        
        def _get_absolute_path(self) -> str:
            return os.path.join(self.base_path, self.relative_path)
        
        def load_image(self) -> ImageTk.PhotoImage:
            return ImageTk.PhotoImage(Image.open(self.absolute_path))
    
    class App(tk.Tk):
        def __init__(self, icon_path: str):
            super().__init__()
            self.icon_path = icon_path
            self._setup_ui()
        
        def _setup_ui(self):
            self.title("Optimized Tkinter App")
            self.geometry("400x300")
            self._set_icon()
        
        def _set_icon(self):
            resources = AppResources(self.icon_path)
            icon = resources.load_image()
            self.iconphoto(True, icon)
    
    if __name__ == "__main__":
        app = App("icon.ico")
        app.mainloop()
    Ответ написан
    Комментировать
  • Нахождение значения в фрейме(или столбце) и при его нахождении добавить дополнительные строки. Как реализовать код в Pandas (Python)?

    @eminsk
    программирую на python
    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))
    Ответ написан
    Комментировать
  • Какой выбрать БП?

    @eminsk
    программирую на python
    Cougar STE 500W будет наиболее подходящим вариантом для твоей сборки. Он обеспечивает необходимую мощность и имеют положительные отзывы о надежности.

    Причины моего выбора для тебя:
    Надежность: Cougar зарекомендовал себя как производитель качественных блоков питания.
    Стабильность: Обеспечивает стабильное питание для твоей конфигурации.
    Отзывы: по поиску в интернете пользователи отмечают хорошую производительность и долговечность.
    Этот блок питания будет отличным выбором для твоей конфигурации твоего компьютера с Xeon E5-2650 v2 и RX 570 8GB.
    Ответ написан
  • Почему Python выдает ошибку в строке с newPosition?

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

    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('Ошибка: ключ должен быть числом.')
    Ответ написан
    Комментировать
  • Как сделать так чтобы когда персонаж касался линии останавливался?

    @eminsk
    программирую на python
    Тебе нужно в функции __init__ описать переменную self.line_y = 370
    и переделать функцию с проверкой на касание с линией
    def tick(self):
        x1, y1, x2, y2 = self.coords(self.box)
        if y2 < self.line_y:  # 
            self.move(self.box, self.dx, self.dy)
        else:
            self.dx = 0
            self.dy = 0
        self.after(self.dt, self.tick)
    Ответ написан
    Комментировать
  • Возможно ли скрыть свой IP адрес в локальной сети?

    @eminsk
    программирую на python
    1. SoftEther — это многофункциональный VPN-сервер, который поддерживает различные протоколы. Он также может быть настроен для работы в локальной сети и позволяет скрывать IP-адреса.
    2. Squid — это прокси-сервер, который может быть установлен на одном из компьютеров в сети. Он позволяет перенаправлять трафик через себя и скрывать реальные IP-адреса других устройств.

    3. Данный код на python и скрывает/изменяет локальный ip адрес на твоем компьютере только или где запущен данный скрипт. по нажатии на клавишу q выход и возвращает обратно в режим DHCP
    в строчке кода замени на свое название то что в кавычках - interface = "Ethernet"
    для его использования установить на своем домашнем компьютере Python и установить библиотеку keyboard, чтобы потом для рабочего места сделать с помощью pyinstaller чтобы не ставить там python.

    import ipaddress
    import random
    import time
    import subprocess
    import platform
    import keyboard  # pip install keyboard
    import re
    
    
    class IPAddressManager:
        """Класс для управления и скрытия IP-адресов в локальной сети."""
    
        def __init__(self, interface: str):
            self.interface = interface
            self.original_ip = self._get_current_ip()
            self.hidden_ip = None
    
        def _get_current_ip(self) -> str:
            """Получить текущий IP-адрес интерфейса."""
            try:
                if platform.system() == "Windows":
                    output = subprocess.check_output(
                        "ipconfig", shell=True, stderr=subprocess.DEVNULL, universal_newlines=True)
                    pattern = re.compile(
                        rf"{self.interface}.*?IPv4.*?:\s*(\d+\.\d+\.\d+\.\d+)", re.DOTALL)
                    match = pattern.search(output)
                    if match:
                        return match.group(1)
                    raise ValueError(
                        f"IP-адрес для интерфейса {self.interface} не найден")
                else:  # Linux и macOS
                    output = subprocess.check_output(
                        f"ifconfig {self.interface}", shell=True, universal_newlines=True)
                    match = re.search(r"inet (\d+\.\d+\.\d+\.\d+)", output)
                    if match:
                        return match.group(1)
                    raise ValueError(
                        f"IP-адрес для интерфейса {self.interface} не найден")
            except subprocess.CalledProcessError as e:
                raise RuntimeError(f"Ошибка при выполнении команды: {e}")
    
        def hide_ip(self) -> None:
            """Скрыть IP-адрес, изменив его на случайный в той же подсети."""
            current_ip = ipaddress.ip_address(self.original_ip)
            network = ipaddress.ip_network(f"{current_ip}/24", strict=False)
    
            while True:
                new_ip = ipaddress.ip_address(random.randint(
                    int(network.network_address) + 1, int(network.broadcast_address) - 1))
                if new_ip != current_ip:
                    self.hidden_ip = str(new_ip)
                    break
    
            self._change_ip(self.hidden_ip)
    
        def restore_ip(self) -> None:
            """Восстановить оригинальный IP-адрес."""
            if self.hidden_ip:
                self._change_ip(self.original_ip)
                self.hidden_ip = None
    
        def _change_ip(self, new_ip: str) -> None:
            """Изменить IP-адрес интерфейса."""
            try:
                if platform.system() == "Windows":
                    subprocess.run(f'netsh interface ip set address name="{self.interface}" static {new_ip} 255.255.255.0',
                                   shell=True, check=True, stderr=subprocess.DEVNULL)
                else:  # Linux и macOS
                    subprocess.run(f"sudo ifconfig {self.interface} {new_ip} netmask 255.255.255.0",
                                   shell=True, check=True, stderr=subprocess.DEVNULL)
            except subprocess.CalledProcessError as e:
                raise RuntimeError(
                    f"Не удалось изменить IP-адрес на {new_ip}. Ошибка: {e}")
    
        def restore_dhcp(self) -> None:
            """Восстановить автоматическое получение IP-адреса (DHCP)."""
            try:
                if platform.system() == "Windows":
                    subprocess.run(
                        f'netsh interface ip set address name="{
                            self.interface}" source=dhcp',
                        shell=True, check=True, stderr=subprocess.DEVNULL
                    )
                    print(f"Интерфейс {
                          self.interface} успешно переведен в режим DHCP")
                else:  # Linux и macOS
                    subprocess.run(
                        f"sudo dhclient -r {self.interface} && sudo dhclient {self.interface}",
                        shell=True, check=True, stderr=subprocess.DEVNULL
                    )
                    print(f"Интерфейс {
                          self.interface} успешно переведен в режим DHCP")
            except subprocess.CalledProcessError as e:
                print(f"Ошибка при восстановлении DHCP: {e}")
    
        def run(self) -> None:
            """Запустить процесс скрытия IP-адреса."""
            print(f"Начальный IP-адрес: {self.original_ip}")
            self.hide_ip()
            print(f"IP-адрес скрыт. Новый адрес: {self.hidden_ip}")
            print("Нажмите 'q' для выхода и восстановления автоматического получения IP.")
    
            while True:
                if keyboard.is_pressed('q'):
                    break
                time.sleep(0.1)
    
            self.restore_dhcp()
            print("Программа завершена. DHCP восстановлен.")
    
    
    if __name__ == "__main__":
        try:
            interface = "Ethernet"  # Тут замени на имя твоего сетевого интерфейса - так как я делал это все на своем компе
            manager = IPAddressManager(interface)
            manager.run()
        except Exception as e:
            print(f"Произошла ошибка: {e}")
    Ответ написан
    6 комментариев
  • Как мне изменить шрифт на CustomTkinter?

    @eminsk
    программирую на python
    import customtkinter as ctk
    
    ctk.set_appearance_mode("dark")
    
    
    class App(ctk.CTk):
        def __init__(self):
            super().__init__()
    
            self.title("Delta Search")
            self.geometry("1050x630")
    
            self.button_frame_1 = ctk.CTkFrame(self,
                                               fg_color='#333333',
                                               border_width=2,
                                               corner_radius=10,
                                               border_color='#f53333',
                                               width=915,
                                               height=50,
                                               )
            self.button_frame_1.grid(row=0, column=0, padx=50, pady=10)
    
            # тут и меняется тебе сам объект  для шрифта
            custom_font = ctk.CTkFont(family="Arial", size=20, weight="bold")
    
            self.button = ctk.CTkButton(self.button_frame_1,
                                        fg_color='#454545',
                                        text='Universal search',
                                        width=150,
                                        height=40,
                                        border_color='#f53333',
                                        corner_radius=10,
                                        border_width=1,
                                        font=custom_font  # Применить тут шрифт
                                        )
            self.button.grid(row=0, column=0, padx=(20, 2), pady=10)
    
    
    app = App()
    app.mainloop()
    Ответ написан
    Комментировать
  • Что делать, если не скачивается видео из youtube (yt_dlp)?

    @eminsk
    программирую на python
    зачем тебе даже 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
    программирую на python
    В 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
    Ответ написан
    Комментировать
  • Как получить цену акций в python?

    @eminsk
    программирую на python
    import yfinance as yf
    import pandas as pd
    
    
    def get_stock_data(ticker: str, start: str, end: str) -> pd.DataFrame:
        """
        Получает данные свечного графика для указанной ценной бумаги.
    
        :param ticker: Символ акции.
        :param start: Дата начала (формат 'YYYY-MM-DD').
        :param end: Дата конца (формат 'YYYY-MM-DD').
        :return: DataFrame с данными акций.
        """
        return yf.download(ticker, start=start, end=end, interval='1d')
    
    
    if __name__ == "__main__":
        ticker = "SBER.ME"  # Символ для Сбербанка на Московской бирже
        start_date = "2021-01-01"
        end_date = "2022-01-01"
    
        print(get_stock_data(ticker, start_date, end_date))

    66f57c781f825463414243.png
    Ответ написан
    Комментировать
  • Не получается записать в файл?

    @eminsk
    программирую на python
    Тебе функцию 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
    программирую на python
    import os
    import signal
    os.kill(os.getpid(), signal.SIGTERM)
    Ответ написан
    Комментировать
  • Сборка пк для работы в Autocad?

    @eminsk
    программирую на python
    1. для AutoCAD важнее частота одного ядра процессора. (не менее 3500 и чем выше тем лучше)
    2. Минимум 16 ГБ оперативной памяти. 8 ГБ может оказаться недостаточно, особенно при работе с большими проектами
    3. NVIDIA Quadro и выше. Игровые карты могут не обеспечить необходимую производительность и поддержку функций, специфичных для CAD (видеокарта)
    4. Обязательно используйте SSD для системы и программ. Это значительно ускорит загрузку и работу приложений по сравнению с HDD
    5. Эффективная система охлаждения, желательно жидкостная, так как рабочие станции могут сильно нагреваться при длительных вычислениях и рендеринге

    Выбирай не меньше что я тебе указал и тем выше параметры тем будет лучше тебе и все зависит от твоего бюджета еще. Я тебе указал самый минимум еще только для небольших проектов. Если будешь заниматься рендерингом то тебе понадобится еще и выше чем эта конфигурация, так как она требует больших вычислений
    как пример видеокарта - NVIDIA Quadro P2000, NVIDIA Quadro RTX 4000, NVIDIA RTX A2000
    Ответ написан
  • Ssd m2 512 или 256 gb?

    @eminsk
    программирую на python
    Размер жесткого диска не повлияет на размер скорости.

    Мой совет бери лучше чтобы была как можно больше скорости чем объем SSD.
    Чем выше скорость SSD тем лучше а не размер жесткого диска, если тебе нужна высокая производительность.
    и поставить и оптимизировать свою OS на максимальное быстродействием с минимальными функциями которые будут грузить систему
    Ответ написан
    Комментировать
  • Как получить изображение из формы в php?

    @eminsk
    программирую на python
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $upload_dir = '/var/www/uploads/'; // Директория для сохранения загруженных файлов
    
        // Обработка основного изображения
        if (isset($_FILES['img']) && $_FILES['img']['error'] == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES['img']['tmp_name'];
            $name = basename($_FILES['img']['name']);
            $img_path = $upload_dir . $name;
            
            if (move_uploaded_file($tmp_name, $img_path)) {
                echo "Файл успешно загружен: $img_path";
            } else {
                echo "Ошибка при загрузке файла.";
            }
        }
    
        // Обработка изображения для карточки
        if (isset($_FILES['card_img']) && $_FILES['card_img']['error'] == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES['card_img']['tmp_name'];
            $name = basename($_FILES['card_img']['name']);
            $card_img_path = $upload_dir . $name;
            
            if (move_uploaded_file($tmp_name, $card_img_path)) {
                echo "Файл для карточки успешно загружен: $card_img_path";
            } else {
                echo "Ошибка при загрузке файла для карточки.";
            }
        }
    }
    ?>

    Убедитесь, что форма имеет атрибут enctype="multipart/form-data":
    <form method="POST" enctype="multipart/form-data">
        <!-- Ваши поля формы -->
    </form>
    Ответ написан
    Комментировать
  • Число вместо сроки при запросе regex?

    @eminsk
    программирую на python
    SELECT 
        b.Cargo, 
        count(b.Cargo), 
        REGEXP_SUBSTR(b.Cargo, '[А-Яа-яЁё]+') AS Category
    FROM base b
    GROUP BY b.Cargo
    Ответ написан
    Комментировать
  • Как создать несколько мостов на один сетевой интерфейс?

    @eminsk
    программирую на python
    Проблема в том, что вы пытаетесь добавить один и тот же физический интерфейс (enp42s0) к нескольким мостам одновременно, что невозможно. Сетевой интерфейс может быть членом только одного моста:
    Создайте один мост (например, br0) и добавьте в него физический интерфейс enp42s0.
    Создайте виртуальные интерфейсы (VLAN или macvlan) поверх моста br0 с нужными MAC-адресами.
    Используйте эти виртуальные интерфейсы для создания PPPoE соединений.
    auto enp42s0
    iface enp42s0 inet manual
    
    auto br0
    iface br0 inet manual
        bridge_ports enp42s0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    
    auto macvlan0
    iface macvlan0 inet manual
        pre-up ip link add link br0 macvlan0 type macvlan
        post-down ip link del macvlan0
        hwaddress e2:3f:26:5c:8d:45
    
    auto macvlan1
    iface macvlan1 inet manual
        pre-up ip link add link br0 macvlan1 type macvlan
        post-down ip link del macvlan1
        hwaddress e2:3f:26:5c:8d:44
    
    auto macvlan2
    iface macvlan2 inet manual
        pre-up ip link add link br0 macvlan2 type macvlan
        post-down ip link del macvlan2
        hwaddress e2:3f:26:5c:8d:43
    Ответ написан
    Комментировать