• Запуск своей программы вместо графической оболочки в Linux?

    @rPman
    Например
    1. отключаешь display manager - lightdm (или что у тебя там для меню авторизации и выбора DE)
    2. минимум что необходимо для работы графического режима - это xserver, для его запуска достаточно запустить утилиту X (кстати кажется до сих пор требует root), будет запущен графический сервер без Desktop Environment, но нужно понимать что DE отвечает за управление окнами, а точнее управление их размерами, положением на экране и вообще сокрытие/минимизация. Т.е. без этого, если твое приложение ожидает что пользователь будет перемещать его окна (а это к примеру диалоговое окно открытия/сохранения файлов) то он уже это сделать не сможет, все окна будут без заголовков и бордюра для изменения их размеров.
    И кстати, чтобы графическое приложение запустилось и отображалось на X нужно устанавливать переменную окружения DISPLAY, значение смотреть либо в конфиге X либо в логах (скорее всего будет что то типа :0, это имя сервера и номер xserver, запущенного на нем, напоминаю, что linux из коробки умеет multiseat)
    3. чтобы появился хоть какой то интерфейс взаимодействия, нужно установить DE, из минималистичных, идеальных для kiosk mode - я бы рекомендовал awesome, в нем к примеру можно настроить чтобы все открываемые окна сразу разворачивались на весь экран.

    Кстати со всеми xserver обычно идет древний дефолтный twm, настолько примитивный что даже смешно, но если бы при открытии любого окна он не требовал от пользователя указать расположение и размер, им можно было бы пользоваться (не удивлюсь если это настраивается но никогда этим вопросом не задавался).

    Из минималистичных и вполне функциональных DE можно предложить еще какой-нибудь openbox, его можно настроить так чтобы вообще никаких 'пуск' и списка задач не было, а только иконки и приложение на весь экран. Но пользователь сможет добраться до редактирования меню и запустить любое приложение, т.е. это не для kiosk mode

    Чтобы запустить xserver с DE автоматически можно либо настроить автозагрузку в lightdm (это правильно) либо просто запускать утилиту startx, которая смотрит в пользовательском каталоге .xinitrc и запускает DE от туда.

    На самом деле процесс запуска DE стал очень замудреный, его запутали несколько поколений разработчиков и выпутывать не желают, но обычно все это критично для тяжелых DE типа KDE, а что то простое и легкое с приложениями на gtk работает и так

    Собственно как запускать приложения автоматически при включении компьютера тоже вопрос очень интересный, способов много, минимум три могу предложить
    * правильный - настроить службу и прописать ей зависимости и автозапуск,
    * так же до сих пор есть устаревший способ настройки службы без зависимостей sysvinit - /etc/init.d
    * ну еще есть /etc/rc.local
    Ответ написан
    1 комментарий
  • Что занимает место на сервере VDS (Ubuntu 20.04)?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    ncdu вам красиво все распишет
    Ответ написан
    Комментировать
  • Как в скрипте Python, во время его работы, переместиться к определенной строчке кода?

    @deliro
    Слава Гвидо, нет
    Ответ написан
    Комментировать
  • Как при клике на область определить координаты XY?

    iggor-markin
    @iggor-markin
    Python Developer
    Пример из документации не подходит?

    fig, ax = plt.subplots()
    ax.plot(np.random.rand(10))
    
    def onclick(event):
        print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
              ('double' if  event.dblclick else' single', event.button,
               event.x, event.y, event.xdata, event.ydata))
    
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    Ответ написан
    Комментировать
  • Python / Generator как это решить?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Для начала - выучить азы pyhon.
    def generator():
        pass
    gen = generator()

    Смысл объявления пустой функции?

    gen = (s(k)/4 for k in range(10)):
    Во-первых, конструкция вида [литерал]([аргументы]) всегда будут восприниматься как вызов функции с названием [литерал] аргументами [аргументы]. А объявленой функции с именем s у вас нет.
    Далее непонятно, зачем у вас двоеточие и print(next(gen)) с отступом.
    И к тому-же, next(gen) не будет работать, т.к. generator() ничего не возвращает.
    Если пытались изменить код, то зачем? Судя по шаблону, вам нужно написать генератор в соответствующей функции generator() и уже по нему итерироваться.
    def generator():
        pass
    
    
    gen = generator()
    for _ in range(10):
        print(next(gen))
    Ответ написан
    Комментировать
  • Почему тут ошибка?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    1.Почему-бы, перед тем как брать откуда-то код (ну или писать свой, не суть) не почитать пару уроков (или пару глав любого учебника) по языку?
    2.В ошибке, которую вы не показали, кстати, четко написано, почему не работает (и даже сказано в каком конкретно месте ошибка):
    IndentationError: expected an indented block after 'while' statement on line 11

    Перевод, на всякий случай (вдруг вы английский не знаете, а абсолютно все переводчики вас забанили).
    IndentationError: ожидался блок с отступом после оператора while в строке 11

    Возможно я ожидаю слишком многого, но тут вроде-бы даже без знания языка можно понять, что нужно сделать (добавить отступ)
    Ответ написан
    Комментировать
  • Как решить проблему indentation error?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Правильно расставить отступы.
    Ответ написан
    Комментировать
  • Нормально ли бросать (throw) внутри async функции?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Где-то читал, что нехорошо кидаться ошибками изнутри async функций
    ... надо только возвращать rejected Promise.

    В этом `где-то` вас обманули, так как любое возвращаемое из `async` функции значение (да, включая throw) уже обёрнуто в `Promise`.

    const foo = async () => { throw new Error('Smth went wrong'); };
    const bar = async () => Promise.reject(new Error('Smth went wrong'));

    Работают абсолютно одинаково
    Ответ написан
    3 комментария
  • Прокси в питоне?

    @Kvason
    Веб-разработчик
    Устанавливаешь requests, создаешь текстовый файл, пишешь туда все что тебе надо и дальше в коде открываешь этот файл, перебираешь построчно и используешь их как в ответе выше
    Ответ написан
    Комментировать
  • Как скидывать файлы с компьютера в какое-нибудь облачное хранилище через Python?

    Зачем пайтон? для любого облачного хранилища существуют клиенты для любой ос, который синхронизирует файлы. Достаточно создать аккаунт, установить программу и залогиниться. А потом просто поместить файл в нужную папку.
    если все же хочется с помощью питона, то вот это подходящий вариант. https://developers.google.com/drive/api
    или яндекс диск https://yandex.ru/dev/disk/rest/
    Ответ написан
    2 комментария
  • Как синхронизировать файлы на сайте с компьюетром на Python?

    @AVKor
    Никакой сайт не нужен. Любая ВПСка, самая дешёвая, плюс rsync. Пайтон не нужен.
    Ответ написан
    Комментировать
  • Как скачать видео с YouTube?

    @rPman
    почему youtube замаскирован звездочками? это стало ругательством?

    по теме, лучший способ не бороться с мельницами (гугл периодически меняет структуру страницы и устаревший код быстро становится нерабочим) - использовать проект youtube-dl (питон), вызывая его утилиту как внешнюю

    точно знаю были врапперы для c# (гугл выдает старый код, может заработает) если надо именно библиотеку
    Ответ написан
    Комментировать
  • Как решить задачу по математике с помощью python?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это не задача на программирование, а задача на математику. Решение - одна формула.

    Сначала решите уравнение, при какой величине вклада X доход от бумаги и от банковского вклада будет одинаков?

    1.1X+2000 = 1.12X

    До этой суммы выгоднее брать бумагу - после - вклад.
    Далее надо 4 раза взять одно из двух, сравнивая текущую сумму с пороговым значением выше.

    От питона вам надо уметь выполнять действие 4 раза:
    for i in range(0, 4):

    Сравнивать 2 значения и делать в зависимости от этого разные действия.
    if a < b:
      foo
    else:
      bar


    Ну, вряд ли вы не знаете, еще надо уметь присваивать переменные и выполнять арифметику - умножение и сложение.
    Ответ написан
    Комментировать
  • Как собрать 32-битный exe файл?

    @rPman
    есть настоящий компилятор python приложений в exe файл (точнее он сначала генерирует c++ файлы а их уже можно компилировать в бинарник нужной архитектуры) - nuitka

    в зависимости от использования библиотек возможно получится и даже увеличится (значительно) скорость работы приложения
    Ответ написан
    Комментировать
  • С чего начинать освоение SDR (Software Defined Radio)?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Можно начать с DVB-T тюнеров на основе rtl2832 коих на том же Aliexpress навалом по вполне умеренным ценам.
    Ответ написан
    3 комментария
  • Почему выдает ошибку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    прочтите внимательно код ошибки и свой код

    Ошибка: (node:25288) UnhandledPromiseRejectionWarning: TypeError:  db.get is not a function

    переводится как: .... db.get не является функцией

    Смотрим дальше:
    let db = require('sqlite') // для примера использую простой в использовании пакет БД "quick.db"

    странно, но пишите про quick.db а подключаете sqlite
    но возможно я не прав и так и должно быть (никогда не использовал ни то ни другое)?

    Смотрю использование sqlite и вижу что инициализация модуля и создание коннекта к ДБ делаются совсем иначе.

    Смотрю quick.db и вижу в примерах так нужные вам db.get() и db.set()

    Вопрос решен!!!

    Ну и напоследок. Либо вы очень устали и стали невнимательны, либо вам нужно срочно приучить себя вчитываться в текст ошибок, и пытаться понять о чем идет речь, а так же подтягивать знание JS, чтобы такие вот ошибки TypeError: db.get is not a function моментально направляли ваши мысли в нужное русло

    const db = require('quick.db');
    Ответ написан
    2 комментария
  • Как спарсить название и цену игры в стиме?

    @rPman
    Зачем столько гемороя если есть официальное api?
    api.steampowered.com/ISteamApps/GetAppList/v0001 - список всех приложений
    store.steampowered.com/api/appdetails?appids=43864... - информация о приложении appids, код страны из которой запрос - cc
    цены в центах [App Id] > data > price_overview
    (взял это отсюда)

    По уму документация тут, ллидербоард тут
    Ответ написан
    Комментировать
  • В чём ошибка определения переменной экземпляра?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекомендую напечатать id объектов, сразу станет видно проблему:

    for i in range(11):
      print (f"`{i} {id(g[i])}")
      for j in range(7):
        print (f"  `{j} {id(g[i][j])}")
        #deb.write(str(i)+"-"+str(j)+" "+str(g[i][j].x)+" "+str(g[i][j].y)+"\r\n")


    кусочек вывода
    `0 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112
    `1 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112


    Все элементы списка длины 11 по первому индексу ссылаются на один и тот же массив длины 7

    Ошибка тут в том, что выражение

    some_list * 11

    конструирует список из 11 ссылок на один и тот же массив. Который на последней итерации цикла получает x=10 во всех элементах.

    Решить можно, например, так:

    g = []
    
    for i in range(11):
      g.append([])
      for j in range(7):
        g[i].append(Point(i, j))


    В python все объекты передаются по ссылке, и это надо учитывать, а при необходимости копировать их явно.
    Ответ написан
    Комментировать
  • Как разделить слова в сообщении telebot?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Если пишете на telebot / pyTelegramBotAPI (вроде-бы) - используйте register_next_step_handler
    Если aiogram - машину состояний и принимайте по части ФИО за раз.
    Ответ написан
    Комментировать
  • Разъясните задачку по Python?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    2 дня всей группой пытаетесь подставить две переменные в уравнение?
    Берете первой число из набора А, потом первое число X, решаете уравнение. Второе число Х. Третье число Х. Когда закончились - берем следующее число А. Таблица - результат функции при подстановке переменных.
    Ответ написан
    1 комментарий