• В чём проблема?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Там "==", а не присвоение нужно использовать.
    Ещё одно подтверждение того, что вам следует почитать туториал, а не бомбить этот ресурс бессмысленными вопросами.

    if __name__ == '__main__':
       app.run(debug=True)
    Ответ написан
    Комментировать
  • Не могу понять: как работают post запросы в python?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Почитайте как устроен HTTP-протокол хотя бы на вики.
    Есть http-сервер, который ждёт подключений на свой порт и обрабатывает запросы.
    Каждый запрос характеризуется методом (get, post, put, head, и т.д.), адресом (и это отдельный фактор, никак не взаимосвязанный с методом), заголовками (там у нас пожелания клиента о формате ответа, куки всякие, инфа о клиенте), телом (там у нас данные форм post-запросов, просто загружаемые файлы вроде аватарки или json'а...).
    Каждый такой запрос получает сервер и даёт на него какой-то ответ или даже может проигнорировать закрыв или не закрыв соединение.

    Написать post-запрос - это, как следует понимать, написать код для выполнения post-запроса (от клиента к серверу, конечно же, иначе не бывает).
    Если сервер по данному адресу или по другим каким-то причинам не принимает post-запрос, то вы не сможете со стороны клиента заставить его сделать это.
    Даже если будете бить палкой.
    Сервер вам будет отвечать ошибкой с каким-то кодом. Если разработчики сервера молодцы, то код ошибки будет релевантен ситуации, а вообще там nt[ybxtcrb может быть что угодно, хоть 666 Devil request success.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Проектируйте микросервисно. Получится как лего: опрятно и взаимозаменяемо.
    Тем более разные части можно делегировать подружкам по кафедре.

    Итак, микросервисы:
    • 1. Модуль захвата. Можно сделать на основе opencv. Присасывается к видео-потоку и ищет что-то похожее на лица, трекает их (opencv это хорошо умеет). Кадры с лицами гурппами кладёт в очередь (которая у вас отдельным микросервисом рядом крутится). Группы нужны, чтобы можно было улучшить распознавание за счет выбора наиболее однозначно распознаваемых ракурсов.
    • 2. Сервис распознавания. Вытаскивает таски с группами фоток из очереди и кидает в другую очередь на классификацию. После классификации всех вариантов группы выбирает самые надёжные варианты и пишет в БД события.
    • 3. Сервис классификации. Это воркер, он может масштабироваться (запускаться в нескольких экземплярах).
    • Достаёт таск (фоточку) из очереди, даёт своей нейроночке, а та выдаёт идентификатор класса и степень похожести.
    • 4. Вебсервис реализации дэш-борда - рендер и публикация текущей статисики и текущих событий.
    • 5. Сервис срочных уведомлений - выискивает из БД свежие тревожные события и рассылает СМС, дёргает сирену и активирует пулемётные турели.

    Читайте про SOLID. Это надо знать и уметь как "отче наш".
    Ответ написан
    2 комментария
  • Обьясните пожалуйста работу setup.py и distutils?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не совсем. setup.py - это скорее файл, описывающий ваш пакет, чтобы distutils знал как его устанавливать, какие у него зависимости, кто автор, какие точки входа и прочее.
    Вот на хабре отличная статья как сделать идеальный пакет: https://habr.com/ru/post/483512/
    Ответ написан
    Комментировать
  • Какой программой можно быстро сделать из json в csv?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    import csv
    import sys
    import typing
    import json
    
    
    def deep_walk(j, path=()):
        if isinstance(j, dict):
            for k, v in j.items():
                yield from deep_walk(v, path + (f'.{k}',))
        elif isinstance(j, list):
            for i, v in enumerate(j):
                yield from deep_walk(v, path + (f'[{i}]',))
        else:
            yield path, j
    
    
    def json2csv(data: typing.Union[dict, list], dest: typing.TextIO = None):
        field_set = set()
        records = []
        if isinstance(data, dict):
            data = [data]
    
        for item in data:
            record = {''.join(path).lstrip('.'): value for path, value in deep_walk(item)}
            records.append(record)
            field_set.update(record.keys())
    
        w = csv.DictWriter(dest or sys.stdout, fieldnames=list(sorted(field_set)))
        w.writeheader()
        w.writerows(records)
    
    
    if __name__ == '__main__':
        if sys.argv[1:]:
            with open(sys.argv[1]) as f:
                json2csv(json.load(f))
        else:
            json2csv(json.load(sys.stdin))

    Входной json можно передать в виде имени файла первым параметром или отправить его программе через stdin.

    Запостил чтобы показать, что такие вещи - не "рокет сайнс". Просто нужно чуточку подумать и сделать.
    А вот как сделать, чтобы прога не нуждалась в загрузке всего входного json-а в память, прежде чем начать писать в выхлоп - это уже куда интереснее.
    Например можно наставить в начале файла много-премного пробелов (чтоб наверняка хватило на заголовок), а потом по факту вывода всего файла дорисовать в начало заголовок в нужном порядке. Но это так себе идеечка. Костылями попахивает.
    Ответ написан
    Комментировать
  • Как вывести первый ключ из словаря?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Как вывести первый ключ из словаря?

    Как вывести только 'Pomidorka' из словаря?

    Вы спрашиваете как вывести первый ключ, а потом говорите про помидорку, а это третий ключ. Так чего именно вы хотите?

    Если речь о том, чтобы вообще получить все ключи из словаря, то воспользуйтесь учебником, по питону и там вы увидите:
    list(users.keys())  # ['Ivan', 'Anton', 'Pomidorka', 'Ananas']

    Такой порядок для вашего кода будет в питоне начиная с 3.6.

    Если нужно взять именно первый ключ, то так:
    list(users.keys())[0]

    Если речь о современном питоне (начиная с 3.6), то порядок ключей в словаре сохраняется при добавлении элементов, поэтому помидорку получать придётся запрашивая 2 (третий по счету) элемент списка ключей:
    list(users.keys())[2]

    Если питон у вас более старенький, то порядок следования ключей не гарантируется и вам придётся объяснить, всё же, помидорку вам или просто первый попавшийся ключ.

    Короче. Бесят эти лентяи, которые вместо чтения крошечной книжки для чайников задают тут тупые бестолковые и неконкретные вопросы, на которые, чтобы нормально ответить, нужно тратить уйму времени. ХВАТИТ ЭТО ТЕРПЕТЬ!
    Даёшь дизлайки за вопросы и за ответы!
    Ответ написан
    Комментировать
  • Как работает табуляция в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Описанная вами ошибка происходит из-за смешивания в отступах табов и пробелов.
    Иногда редактор не очень понятно показывает вам где у вас табуляция, а где группа пробелов. Этим грешит, например, mcedit.
    рецепт прост: никогда не пользуйтесь табами в питоне. Вопрос, конечно, холиварный, но если у вас с табами проблемы, то вам они точно нигде не нужны. Это значит, что вы не можете адекватно настроить редактор и увидеть где табы и где пробелы.
    Для вас будет правильным объяснить редактору, что для питоновских файлов следует всегда заменять таб на 4 пробела.

    В питоне табуляция работает также как и везде. Просто операторные скобки в этом языке определяются отступами. Лично мне это решение очень нравится, хотя и порождает ряд неприятных проблем. Кстати запрет на смешивание отступов - это не проблема. Их смешивать - это плохой тон во всех языках, в том числе и yaml и где угодно.
    В питоне с такими операторными скобками проблемы с ограниченностью лямбда-функций, а ещё затруднительно писать однострочники для `py`.
    Ответ написан
  • Как сделать массив немножко отсортированным?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А как считать на сколько сместился элемент? По абсолютному индексу?
    Ну и да, нужно сделать массив "полностью" или "немножко" отсортированным?
    Из постановки задачи не ясны критерии. Полностью отсортировать любой массив нельзя за указанное число шагов с указанными ограничениями.
    Нам остаётся лишь увеличивать степень упорядоченности.
    Снова возвращаемся к критериям степени упорядоченности.
    Их можно придумать несколько:
    - количество "выбивающихся" элементов
    - минимизация суммы расстояний элементов от их оптимальной позиции.
    - среднее расстояние элемента от оптимальной позиции.
    - суммарное расстояние элементов от оптимальной позиции.
    Ответ написан
    Комментировать
  • Ubuntu сочетание клавишь для выбора конкретного языка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Не факт, что эта статья ответит на ваш вопрос в его оригинальном виде, но по крайней мере это достаточно широкий ответ про сочетания клавиш в убунту.
    Сегодняшняя статья на хабре: https://habr.com/ru/post/486872/
    Ответ написан
  • Почему не работает сортировка списка в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    5e3948e66cddf596697310.png
    Есть похожие или даже одинаковые по начертанию, но совершенно разные по коду и порядку символы в юникоде.
    Это часто вызывает проблемы.
    Если вы точно знаете, что в ваших именах должны быть только русские буквы, то можете обработать строки заменяя похожие по начертанию символы. В таком виде, конечно, решение не пригодно в случае, если у вас попадётся имя полностью на английском.
    Можно также проверять наличие непохожих по начертанию символов в имени, и если таковые есть, значит замены сделаны не по ошибке. Можно сделать автоматическую обратную подстановку, если в имени нет непохожих на английские русских букв.
    В любом из этих случаев могут возникнуть ситуации некорректного трактования имени. К примеру к вам пришел "АВРААМ" и утверждает, что его родители большие затейники, русского не знают, к евреям отношения не имеют, а дома его называют "Абпаамом".
    users = ["Андрей", "София", "Cветлана", "Валерий", "Илья", "Mаксим", "Дмитрий", "Лиза"]
    trans_table = str.maketrans(
        'ABCEHKMOPTXacekmopuxy', 
        'АВСЕНКМОРТХасекмориху',
    )
    russian_letters_normalizer = lambda s: s.translate(trans_table) if isinstance(s, str) else s
    print('Original:', users)
    print('Sorted:  ', list(sorted(users, key=russian_letters_normalizer)))
    Ответ написан
    Комментировать
  • Как лучше хранить список GPS-точек в PostgreSQL 9.6 с расширением postgis?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Некропостит.
    Ваш вопрос довольно хорошо гуглится, так что добавлю свой вариант ответа.
    Ключевой момент в том, что вы делаете трекинг. Для предметной области важны следующие сущности:
    • Сессия - относительно непрерывный (без больших пропусков) участок траектории движения: границы сессии во времени, границы в пространстве, длительность сессии, пробег сессии, время простоя, время в движении, средняя скорость, максимальная скорость, медианная скорость.
    • Точка трека - сообщение от GPS-трекера:
      • время,
      • координаты,
      • скорость,
      • уровень сигналов GPS и GSM,
      • уровень топлива,
      • датчики дверей,
      • датчики работы двигателя,
      • текущая точность GPS,
      • и т.д.

    • Маршрут - информация о траектории без детализации профиля скорости. Длина, мат-ожидания времени пути для разных ТС...
    • Точка маршрута.

    Очевидно, что ввиду всего этого у вас никак не получится хранить точки треков в поли-линиях постгиса.
    Зато можно кэшировать их агрегированную геометрию в этом формате для скорости и простоты работы. Но это самое кэширование имеет смысл только если вам эта оптимизация реально нужна (медленно отдаются треки, медленно и сложно джойнятся сессии...). Зачем делать то. что можно было бы не делать?
    А на счет размера БД я бы на вашем месте и месте вашего коллеги вовсе бы не беспокоился. Сейчас хранилища дёшевы и масштабируемы, никогда не поздно чистить старые ненужные данные, Данные у вас отлично индексируются и фильтруются по времени, можно дампы старых данных сливать в холодное хранилище, вдруг приспичит когда-то сделать инфографику или болшой анализ.
    Я бы пожалел отказываться от детальной инфы по точкам трека в пользу какой-то сомнительной преждевременной оптимизации.
    Ответ написан
    Комментировать
  • Как правильно реализовать ООП python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    import telebot
    import requests
    import pprint
    import time
    
    botToken = "token"
    chanelName = "@wo"
    
    class Bot:
      def __init__(self,nameChanel,token):
        # todo: проверьте pep8: форматирование (пробелы, indent=4), нейминг (CamelCase vs snake_case)
        self.name = nameChanel
        self.bot = telebot.TeleBot(token)
        # todo: Неадекватное имя bot. Вызывает путаницу в связи с именем класса Bot
        #self.source = source
    
      def getIDGroup(self,str):
        # todo: str - это встроенный тип, по смыслу должно быть ясно, что можно итерировать
        arr = []
        # todo: Неадекватное имя arr. Имя должно указывать не на тип, а на суть того, что поименовано.
        for nameGroup in str:
          url = f"url"  # todo: Зачем тут форматная строка, если нет переменных? Видимо ошибка.
          response = requests.get(url).json()['response']['object_id']
          # todo: Где проверка ответа на ошибки?
          # todo: Неадекватное имя. Назовите object_id
          arr.extend(self._getPostsGroup(response))
        return self._editPosts(arr)
    
      def _getPostsGroup(self,number):
        # todo: Неадекватное имя number. Назовите group_id 
        number = str(number)
        url = f"url"
        response = requests.get(url).json()['response']['items']
        # todo: Неадекватное имя. Назовите object_id
        return response
    
      def _editPosts(self,posts):
        with open('id.txt','r') as file:
          list = file.read().split()
          # todo: имя переменной перекрывает встроенный тип, не отражает содержимое
          # todo: Зачем read и split, если можно list(file) и идентификаторы хранить в строках?
          file.close()
          # todo: Зачем close, если with?!
        
        for item in posts:
          count = list.count(str(item['id']))
          # todo: Зачем вам тут count, если нужна лишь проверка на вхождение?
          if count:
            continue
          photo = ""
          # todo: почему не None?
          for img in item['attachments'][0]['photo']['sizes']:
            if img['height'] > 300:
              photo = img['url']
              break
          text = item['text']
    
          self._sendMessageBot(text,photo)
          with open('id.txt','a') as file:
            # todo: ну использовали бы уже хотя бы shelve
            file.write(str(item['id'])+' ')
            file.close()
            # todo: опять close
    
    
      def _sendMessageBot(self,text,photo):
        if photo:
          if text:
            self.bot.send_photo(self.name,photo,caption=text)
            return
          else:
            self.bot.send_photo(self.name,photo)
        if text:
          self.bot.send_message(self.name,text)
    
        # Функция могла выглядеть так:
        # if photo:
        #   self.bot.send_photo(self.name, photo, caption=text)
        # elif text:
        #   self.bot.send_message(self.name, text)
        # Но лучше не допускать вызова с пустыми аргументами. Это бессмысленно и плохо
    
    bot = Bot(chanelName, botToken)
    # вот как понимать такое: bot.bot? Нейминг!!!
    posts = bot.getIDGroup() #name of group

    Зачем каждый раз читать и писать файл, когда у вас бот в памяти остаётся?
    По меньшей мере вы можете хотя бы не читать каждый раз, сохраняя идентификаторы в множестве памяти (кэш), а загружать это множество из файла только при старте бота. Писать можно и так. Но у вас функции не соответствуют принципу single responsibility (почитайте SOLID)

    Всё плохо. Прежде чем думать об ООП почитайте хотя бы туториал по питону или любую книжку Питон для чайников.
    Хороший тон давать код на ревью в гитхабе. Там можно удобно, с подсветкой синтаксиса и нумерацией строк прокомментировать весь ваш ... код, а вы сможете его потом итеративно улучшать и мне не придётся заново убеждаться, что вы учли все замеченные проблемы при повторном ревью.
    Вот бесит прям. Пожалуй не буду больше ревьюить первые потуги настолько самоуверенных программистов. Просто не вежливо дёргать сообщество не почитав даже основы.
    Ответ написан
    3 комментария
  • Как при помощи bat-файла запустить программу python и ввести данные в нее?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Конечно возможно. У меня сейчас винды под рукой нет, но выглядеть будет примерно так.
    Программа, назовём её my_python_script.py:
    x = input()
    print('Text from input:', x)

    Батник:
    echo the string for python | python my_python_script.py

    Если инпутов несколько, то передать нужно несколько строчек.
    Чтобы сделать это с помощью echo, нужно написать строку с абзацем внутри. Я понятия не имею как экранируется абзац в bat-файлах, поэтому могу предложить такой вариант.
    my_python_script.py:
    x = input()
    y = input()
    z = input()
    rest = []
    while z != 'END':
        rest.append(z)
        z = input()
    
    print('x=', x, 'y=', y)
    print('rest=', rest)


    my_script.bat:
    echo The X string
    echo The Y string
    echo Other string 1
    echo line 2
    echo line 3
    echo line 4
    echo END

    Вызываем так:
    my_script.bat | python.exe my_python_script.py
    Весь выхлоп из батника попадёт на вход питоновского скрипта.
    Можно сделать еще один батник, который сделает такой вызов. Можно описать подпрограмму внутри батника, которая будет печатать строчки и в том же батнике её вызвать пайпом с передачей питону.

    Пайп - это такой виртуальный файл в операционной системе, который можно либо читать, либо писать. либо и то и другое. Зависит от того как сделан пайп. Для каждой программы система при запуске создаёт три пайпа: stdin, stdout, stderr.
    С помощью `|` в командной строке между командами можно сделать конвейер, когда выхлоп левой команды в stdout направляется на вход правой команды в stdin. Таким паровозом можно сколько угодно команд соединить.
    С помощью `>` можно перенаправить stdout в локальный файл с заданным именем:
    echo text to write into the file > the_file.txt
    С помощью `<` можно в stdin передать содержимое файла.
    Там много всяких хитростей с этими перенаправлениями, но лучше почитайте профильную статью или документацию.
    Питон читает с помощью input() из stdin и по умолчанию пишет с помощью print в stdout. echo в bat-файле тоже пишет в stdout.
    В линуксе (и в винде, если поставить поддержку шелла) есть куча других полезных команд и утилит для работы в командной строке (cat, tee, ...)
    Ответ написан
    7 комментариев
  • Python выдаёт ошибку: SyntaxError: invalid syntax что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    if a / b ** > 25.00:
    Вы двойку забыли поставить после звёздочек. Возведение в степень - это бинарная операция, у неё аргументы должны быть слева и справа.
    Ответ написан
    Комментировать
  • Сложный и интересный проект для новичка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    ## Анонимный чат с темами для обсуждения деликатных офисных проблем
    Иногда хочется обсудить что-то с коллегами в офисе, но не хочется смущать их или показывать лишнюю инициативу.
    Например кто-то не смывает в туалете или слишком громко орёт и сам того не замечает. Может быть кто-то слишком интенсивно пользуется парфюмом.
    - Анонимность
    - Постоянная ссылка на чат, тему или дерево чатов
    - ссылки в виде QR-кодов
    - голосовалка
    - закрепленные посты

    ## Сайт checklist
    Веб-сервис и мобильное приложение для краудсорсинга чеклистов для всего: зарегать ИП, получить визу, что делать при ДТП, как влезть в ипотеку, как вылезть из неё, чем заняться с ребенком на выходных (N-ле

    - Коллекция чек-листов снабженных тегами, доступная для краудсорсинга.
    - Краудфандинг составления и поддержки нового листа.
    - Фильтрация чек-листов.
    - Фильтрация пунктов.
    - Тегирование пунктов.
    - Графовые алгоритм обхода чек-листа.
    - Мастер обхода чек-листа.
    - Отчет по чек-листу.
    - Вложенные чеклисты, гиперссылки между разными листами.
    - Параметризация.
    - Экспертная система, логические связи (расширенный режим).

    Примеры:
    - Что делать при ДТП
    - Открыть ИП
    - Осмотр авто при покупке (подветки для разных конкретных моделей)
    - Первая помощь при...
    - Диагностика инсульта
    - Зомби-акопалипсис: как приготовиться
    - Атомный взрыв неподалёку - что делать
    - Планетарная катастрофа - как выживать
    - Поход выходного дня - что взять
    - Подготовка авто к поездке
    - Путешествие: Алжир (виза, прививки, документы, отели, транспорт)
    - Как влезть в ипотеку
    - Как вылезть из ипотеки
    - Как быстро заработать (во все тяжкие)
    - Покупка квартиры (на что обратить внимание)
    - Самостоятельное строительство дома (общий план)
    - Чем заняться с ребёнком N-лет
    - Как отметить новый год
    - Что интересного в районе <пос. Майский>
    - Номера телефонов и документы в автомобиле

    ## Эротический краудфандинг
    Интернет ресурс, где девушки могут делать крауд-фандинговые кампании

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

    ## Простой открытый сервис для обмена сообщениями
    - HTTP API, Web-sockets
    - p2p rtsp
    - опциональное end-to-end шифрование
    - хранение истории на клиентах
    - возможность использования нескольких серверов
    - возможность использования альтруистичных клиентов для проксирования трафика p2p
    - поиск узлов на основе блокчейн технологий и DHT таблиц

    ## Онлайн-журнал путешествия
    - публикация трека в реальном времени
    - комментарии путешественника и фолловеров
    - стримы (аудио, видео, фото)
    - отложенная загрузка
    - журнал(расходы, чек-поинты, расписания, цены, погода)
    - FAQ
    - голосовалка

    ## Поэтический онлайн редактор
    - выбор стопа, стиля и жанра
    - шаблон с плейсхолдерами, разбивающий текст на слоги
    - облако рифм
    - подражающий автогенератор
    - многосегментный словарный банк (дифференциально-слоистая древовидная структура, своя специфика в верхнем слое, поэлементное ранжирование сегментов)
    - тезаурус
    - словарь сочаетаемости
    - N-граммы поэзии по авторам и стилям
    - корпус поэзии
    Ответ написан
    13 комментариев
  • Как решить проблему с нарушением кодировки при выгрузке файлов через ФТП?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У вас там на странице указана кодировка "windows-1251".
    Нужно везде использовать utf-8 и таких проблем не будет.
    1. Смените кодировку редактора, чтобы буквы стали нормальными, вырежьте текст страницы в буфер обмена.
    2. Смените кодировку редактора на utf-8 и вставьте текст страницы обратно. Кириллица должна остаться нормальной, но уже в другой кодировке.
    3. В теге meta укажите charset=utf-8.
    4. Сохраните и залейте FTP
    5. ...
    6. PROFIT!!!111
    Ответ написан
    Комментировать
  • Как устронить ошибку при запуске программы? Вот ошибка 'rar' is not recognized as an internal or external command, operable program or batch file?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Проблема в том, что питон пытается запускать rar (архиватор такой).
    Такая ошибка возникает, если ОС не может найти запускаемую программу.
    У вас есть два варианта:
    1. указать каталог, где лежит rar.exe в переменной среды окружения PATH

    Windows 10 и Windows 8
    В строке "Поиск" выполните поиск: Система (Панель управления)
    Нажмите на ссылку Дополнительные параметры системы.
    Нажмите Переменные среды. В разделе Переменные среды выберите переменную среды PATH. Нажмите Изменить. Если переменной PATH не существует, нажмите Создать.
    В окне Изменение системной переменной (или Новая системная переменная) укажите значение переменной среды PATH. Нажмите ОК. Закройте остальные открытые окна, нажимая ОК.

    2. В вашей программе указать полный путь к исполняемому файлу.

    Что-то вроде c:/program files/rar/rar.exe
    или где там он у вас лежит.
    Вот так:
    rar_command = '"c:/program files/rar/rar.exe" a -ag {}.rar {}'.format(target_dir,source)

    Ответ написан
    Комментировать
  • Преобразовать в JSON?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    import sys
    import re
    import json
    
    
    r1 = re.compile(
        r"(?P<who>\S*) has (?P<ncalls>\d*) calls \(max (?P<maxcalls>\S*)\) in \'(?P<start>\S*)\' strategy \((?P<holdtime>\S*) holdtime, (?P<talktime>\S*) talktime\), W:(?P<w>\d*), C:(?P<c>\d*), A:(?P<a>\d*), SL:(?P<sl>\S*) within (?P<within>\S*)\s*$"
    )
    
    
    with open('ast.txt') as f:
    
        js = []
        append_to = []
        m = None
        for l in f:
            m = r1.match(l)
            if m:
                js.append(dict(members=[], callers=[], **m.groupdict()))
                m = None
            elif 'No Members' in l or 'No Callers' in l:
                pass
            elif 'Members:' in l:
                append_to = js[-1]['members']
            elif 'Callers:' in l:
                append_to = js[-1]['callers']
            elif l.strip():
                append_to.append(l)
    
        print(json.dumps(js, indent=2))


    Также можно парсить еще одним регекспом и строки второго уровня. Если надо, напишу вам регексп.
    Или что вам там требуется вообще?

    Вот ещё вариант:
    cat logfile.log | py -x "getattr(re.match('^(\S+) has (\S+) calls.*$', x), 'groups', lambda: None)()" | py -x "dict([eval(x)])"

    Или так:
    cat logfile.log | py -x "'{{\"{0}\": \"{1}\"}}'.format(*x.split()) if x.split()[1:2] == ['has'] and x.split()[3:4] == ['calls'] else None"
    Ответ написан
  • Проблема с символическими ссылками?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вообще поддержка симлинков может быть опасной в такого рода расшареных ресурсах.
    У меня под рукой доступа к настройкам ftp нет, но такое ощущение, что там в конфиге была специальная опция. Могу ошибаться.

    Однако общее правило такое. Симлинк нужно делать от корня ftp на папки внутри расшаренной. Нужно избегать линкования на внешние каталоги, поскольку это может вызвать уязвимость (доступ к файлам, к которым вы не планировали давать доступ).

    Ещё есть вариант без симлинков:
    mount --bind /source/dir /destination/dir
    И в fstab:
    /source/dir /destination/dir none defaults,bind 0 0

    Но не во всех файловых системах.
    Жесткие ссылки, по идее, должны работать в любом случае.
    Ответ написан
  • Чем открыть большой sqlite-файл?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если делать запрос, то результат тот же.

    А какой запрос вы делаете? Добавьте в него конструкцию `LIMIT , ` и получайте данные порциями.
    Нужно посмотреть ещё ваш запрос. Вдруг там full join и всё, само собой, не помещается в память.
    Ответ написан