Ответы пользователя по тегу Python
  • Как запустить скрипт для нескольких пользователей одновременно?

    gscraft
    @gscraft
    Программист, философ
    Если правильно понял Вашу проблему, то никаких дополнительных усилий прилагать не нужно, данные каждого пользователя будут заполняться параллельно друг другу. Если, конечно, у Вас нет проблем с конфигурацией базы данных, с многопоточной работой серверного приложения и с однопоточным подключением в приложении, например. В остальном, вся сеть так работает: пользователи инициируют работу тех или иных хранилищ, те в свою очередь спокойно параллельно пишут данные. Сложнее решить как раз обратное: исключить одновременную перезапись связанных данных или не выполнять одну работу многократно. Если Вы как раз эту проблему хотите решить, чтобы многие пользователи имели доступ к одному ресурсу данных, используйте блокировки, транзакции. Ну или переосмысляйте архитектуру приложения / структуру данных. Без подробностей вряд ли что-то еще можно посоветовать.
    Ответ написан
    5 комментариев
  • Как вывести список с фигурными скобками?

    gscraft
    @gscraft
    Программист, философ
    Вас непросто понять. Почему нужен вывод фигурными скобками? set — не функция, а класс, попробуйте вывести type(set). Когда Вы вызываете s = set() — создаете экземпляр класса набора данных, с помощью set(list()) — конвертируете список в множество. Если задание подразумевает создание типа данных, аналогичного set уникальностью значений, то оно несколько сложнее, чем то, что делаете Вы, и фигурные скобки здесь не причем. Вам нужно реализовать класс с методами, добавляющими значения с проверкой на уникальность. Причем, делается это разными способами, можно, например:
    class MySet(object):
      def __init__(self):
        self.items = list()
    
      def add(self, item):
        try:
           self.items.index(item)
           self.items.append(item)
        except ValueError as e:
           pass
    Ответ написан
  • Как создать ярлык запуска скрипта python?

    gscraft
    @gscraft
    Программист, философ
    Во-первых, можно ассоциировать Python-сценарии с интерпретатором (инсталлятор это делает, если не ошибаюсь). От администратора в Windows (pythonw — для запуска без консоли):
    assoc .py=PythonScript
    ftype PythonScript=path-to\python.exe "%1" %*
    assoc .pyw=PythonScriptWindow
    ftype PythonScriptWindow=path-to\pythonw.exe "%1" %*

    — в таком случае любой py / pyw будут запускаться двойным щелчком.
    Во-вторых, запуск через интерпретатор можно прописать в ярлыке, в его свойствах:
    5f66003cd4a26888664301.png
    В-третьих, как советуют рядом, создать bat файл, в котором будет по сути то, что в ярлыке, но это повлечет за собой окно терминала.
    В-четвертых, pyinstaller — неплохой вариант в целях автономности приложения. Сборка проходит быстро, ее можно настроить под локальное размещение и в один клик.
    Ответ написан
    5 комментариев
  • Sublime Text 3 как выключить автоматическое добавление скобок () после функций?

    gscraft
    @gscraft
    Программист, философ
    Так включить или выключить? Другого способа, кроме закрытия по открывающей скобке, нет. Разве что какие-то отдельные IDE-плагины смогут дополнить функцию из выпадающего списка и сразу добавить скобки, а иначе редактор никак не отличит, это часть текста или именно функция. Ну и потом, какая разница, нажать Tab, Enter или открыть скобку? За что отвечает опция:
    {
      "auto_match_enabled": true
    }

    По своему опыту скажу, лучше приспособиться, чем цепляться за такие мелочи привычек. Погоды снипеты и опции не сделают. Чем больше будете привыкать к разным окружениям в разных редакторах, тем проще будет мигрировать, не теряя время на такие мелочи.
    Ответ написан
    Комментировать
  • Как найти все теги и вытащить значения из них?

    gscraft
    @gscraft
    Программист, философ
    Смотрите документацию по BeautifulSoup
    div_elements = soup.find_all('div', {'class': 'with-overtask'})
    for div in div_elements:
      imgg = div.find('img')['src'] # ... и т.д.
    Ответ написан
  • Перекодировка в Python, как кратко записать?

    gscraft
    @gscraft
    Программист, философ
    А откуда есть такая строка? Она должна была поступить как вам как биты и сразу при поступлении конвертирована с помощью decode().
    b'\xd0\x94\xd0\xb0, \xd0\xbf\xd1\x82\xd0\xb8\xd1\x86\xd1\x8b \xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81\xd0\xbd\xd1\x8b'.decode()
    Ответ написан
    Комментировать
  • Почему self не вызывается?

    gscraft
    @gscraft
    Программист, философ
    А что у вас self делает в def end(self, lang=self.lang) , это так не работает, нельзя в определении метода передать self в качестве значения по умолчанию. К слову, у Вас в конструкторе self.lang = "en", игнорируется lang. В методе end у Вас уже есть self внутри метода и переменная lang. Сравнение должно быть внутри (например):
    class X:
        def __init__(self, lang=None):
            self.lang = lang
    
        def end(self, lang=None):
            if not lang:
                 lang = self.lang

    — хотя в этом нет особого смысла.
    Ответ написан
    Комментировать
  • Как правильнее запросить/ограничить несколько отношений в Peewee?

    gscraft
    @gscraft Автор вопроса
    Программист, философ
    Собственно, других вариантов нет, есть лишь один более-менее эффективный способ ограничить выборку, чтобы не жертвовать выборкой id IN и не нагромождать колонки, реализовать метод, для получения колонок, например:
    class BaseModel(Model):
        class Meta:
            database = database
    
        @classmethod
        def fields(cls):
            fields = list()
            for field in cls._meta.sorted_fields:
                if not isinstance(field, ForeignKeyField):
                    fields.append(field)
            return fields

    И впоследствии выбирать так (из примера выше):
    select = Delivery.select(Delivery.sender, *Delivery.fields()).limit(3)

    Впрочем, это не отменит погружения, если sender имеет несколько зависимостей, они все будут запрошенными. Плюс, если запрос подразумевает условие по связанной модели, придется делать JOIN и Delivery.sender будет "дублироваться" и другие мелкие неудобства.

    Жаль, Peewee одна из самых элегантных библиотек в своем роде и позволяет очень быстро прототипировать приложение. Но решения по загрузке связей у разработчиков странные и удивительно, что не работает lazy_load (а в обратном случае, как выбирать записи с погружением и без JOIN?).
    Ответ написан
    Комментировать
  • Как реализовать консольный файловый менеджер на Python?

    gscraft
    @gscraft
    Программист, философ
    Хех, Вы просите буквально набросать Вам стек и частью архитектуру приложения, но при этом слабо понимаете предмет, судя по желанию использовать вывод в файл (не прибегая к очевидному использованию встроенных функций языка). Так вот, какие библиотеки использовать? Достаточно стандартной библиотеки языка:
    https://docs.python.org/3/library/filesys.html
    https://docs.python.org/3/library/curses.html

    Какой алгоритм использовать? Делайте то, что описали. Получайте списки файлов, выводите панели, обрабатывайте ввод.
    Ответ написан
    Комментировать
  • Использование dll в python как повлияет на производительность?

    gscraft
    @gscraft
    Программист, философ
    Вопрос старый как мир. Я бы сказал так, без острой необходимости не усложняйте себе работу — пока время дороже, чем расходы приложения. И занимайтесь переносом в бинарные библиотеки лишь тогда, когда твердо будете понимать такую необходимость.

    И наоборот, если ищете ответ в Google, значит не осознаете проблемы. Но общего ответа и не найдете, ведь это аналитическая задача для каждого конкретного случая. Тогда как чаще всего просадки в работе алгоритмов решаются оптимизацией. Так, был случай работы с огромными XML документами, сначала мелькнула мысль о переносе на C++ или поиске бинарной-XML библиотеки, однако профайлер показал, что узким местом являются 2 списка, никак не библиотека XML на чистом Python. Списки пришлось разбить, убрать поиск по ним и т.д., и сэкономил 80% времени в работе алгоритма.
    Ответ написан
    2 комментария
  • Обращение к файлу часть пути которого в переменной?

    gscraft
    @gscraft
    Программист, философ
    from pathlib import Path
    
    root = Path.cwd() # например, рабочий каталог скрипта (не стоит использовать __file__)
    abc = "pyti"
    needle = root / abc / 'concrete_file_name'


    UPD by Dr. Bacon os.getcwd() => Path.cwd()
    Ответ написан
    4 комментария
  • Как записать скопированный текст в переменную?

    gscraft
    @gscraft
    Программист, философ
    Если не захотите использовать API операционной системы, проще проверять содержимое буфера обмена по таймеру: https://pypi.org/project/pyperclip/

    Если готовы погрузиться, можно воспользоваться https://github.com/mhammond/pywin32 и копать в эту сторону: https://docs.microsoft.com/ru-ru/windows/win32/api... подписать свое окно (увы, и оно Вам понадобится) на событие https://docs.microsoft.com/en-us/windows/win32/dat...

    Возможно, найдется готовая библиотека.
    Ответ написан
  • Узнать количество массивов и подмассивов JSON в Python?

    gscraft
    @gscraft
    Программист, философ
    Эм, а почему просто не перебрать в цикле?
    # data[0]['positions'][0]["statusCode"]
    for item in data:
      positions = data.get('positions')
      if isinstanceof(positions, list): # например, проверьте, если значение может быть пустым
        for position in positions:
          status_code = position.get('statusCode') # стоит всегда называть_переменные_змейкой
          if status_code == 'abc': pass # делайте, что Вам нужно
    Ответ написан
    Комментировать
  • Как с помощью библиотеки requests взять ссылку с определенного HTML тега?

    gscraft
    @gscraft
    Программист, философ
    Если Вы смогли получить содержимое страницы по адресу с помощью requests, хотя это решается и коробочным urllib:
    import urllib
    f = urllib.request.urlopen('https://your.site')
    html = f.read(100).decode('utf-8')

    ... то далее нужна библиотека для разбора HTML-кода, иначе не получится. Это уже вне компетенции requests / urllib. Можете воспользоваться встроенной библиотекой перебором элементов и изловчившись с поиском, или прибегнуть к сторонней. Я не решу за Вас разбор кода, но покажу пример с BeatutifulSoup:
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html) # HTML, взятый по ссылке
    img = soup.find('div.w3-container img.w3-image') # Вам придется продумать выборку
    src = img.attrs.get('src')
    Ответ написан
    Комментировать
  • Как вывести содержимое двухмерного массива без скобок?

    gscraft
    @gscraft
    Программист, философ
    print('\n'.join([', '.join(j) for j in x]))
    Ответ написан
    Комментировать
  • Какое правильное и универсальное решение по округлением в jinja2?

    gscraft
    @gscraft
    Программист, философ
    Хех, просто добавьте свой фильтр: https://jinja.palletsprojects.com/en/2.11.x/api/#c... , это здоровая практика.

    def smart_round(text: str, ndigits: int = 2) -> str:
        try:
            number = round(float(text), ndigits)
            if number == int(number):
                number = int(number)
            return str(number)
        except: # строка не является float / int
            return ''
    Ответ написан
    7 комментариев
  • Почему при установке libreOffice не появляется команда soffice?

    gscraft
    @gscraft
    Программист, философ
    soffice.exe есть, но находится в папке программы: libreoffice\program\soffice.exe , и не добавлен в переменную окружения PATH, поэтому глобально команда не может быть вызвана. В среде Windows, как я понимаю (под Linux оно попало бы в пути поиска), Вам либо придется обращаться к приложению по полному пути: C:\Program files\libreoffice\program\soffice.exe (у Вас путь может отличаться), либо добавить путь в переменные окружения: https://i.imgur.com/LROVZIN.png
    Ответ написан
    Комментировать
  • Как вызвать асинхронную функцию из обычной функции?

    gscraft
    @gscraft
    Программист, философ
    Вам придется идти асинхронно от корня, любой async сопровождается await (и наоборот):
    import asyncio
    
    async def main():
        await ... # вызов библиотек
    
    if __name__ == "__main__":
        loop = asyncio.get_event_loop()
        try:
            loop.run_until_complete(main()) # передайте точку входа
        finally:
            # действия на выходе, если требуются
            pass

    Да, стоит разобраться с работой asyncio по документации или публикациям-гайдам.

    PS почему Main_telegram а не MainTelegram ? Обратите внимание на https://www.python.org/dev/peps/pep-0008/#class-names , есть смысл следовать подходам в стиле кода.
    Ответ написан
    2 комментария
  • PyQt5 Python, открытие виджета при выборе пункта menubar, как реализовать?

    gscraft
    @gscraft
    Программист, философ
    Не помешает, конечно, привести код форм. Вы должны дать действию имя, и найти его через объект, полученный после загрузки ui, и подключить к сигналу действия — слот:
    win = uic.loadUi("main_window.ui")
    action = win.findChild(QAction, "your_action_name")
    action.triggered.connect(your_object.your_slot)


    Вы можете определить свой класс окна, чтобы задать в нем обработчики:
    class MainWindow(QtWidgets.QMainWindow): # ваш базовый класс
        def __init__(self):
            super(Ui, self).__init__()
            uic.loadUi('main_window.ui', self)
    
            action = self.findChild(QAction, "your_action_name")
            action.triggered.connect(self.your_slot)
    
            self.show()
    
        def your_slot(self):
            pass


    Создать новое окно можно таким же образом:
    widget = uic.loadUi("widget.ui")
    widget.show()

    Однако, не забудьте, что если widget создан внутри слота-обработчика, ссылка будет уничтожена по завершению функции. Вы можете привязать виджет к классу главного окна (self.widget = None), затем в обработчике действия проверяя, создан и открыт ли он.

    PS старайтесь избегать транслитерации и "неполноценных" имен объектов, вроде "glav". Это в первую очередь показывает неаккуратность кода и послужит ошибкам в будущем.
    Ответ написан
    Комментировать