Ответы пользователя по тегу Python
  • Пригодится ли мне опыт 1С-программиста в работе (не 1С)-программистом?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Работать (1С например), и параллельно изучать :-)
    Так я выучил сначала Java, будучи эмбеддед-разработчиком (С/asm). А затем и питон, будучи на другом месте java-разработчиком :-)
    Но, я как бы не просто так изучал, а старался применить на практике. Изучение явы начал с написания отладочной программы под яву под винду (благо вообще с виндой не работал) для работы с COM-портами (java-serial).
    С питоном также, нужно было разработать какую-то простую приблуду, которую на питоне было проще решить.
    Ответ написан
    Комментировать
  • Как организовать работу с деньгами в базе данных в python3?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Ну, опишу, как это обычно делается.
    1) значения хранить только в целочисленном виде, соотвественно, если у вас 11 рублей и 20 копеек, в базе должно лежать 1120.
    2) никогда не храним сумму (баланс)! ее всегда вычисляем разностью по двум колонкам debet - credit = сумма
    3) эти две колонки никогда не растут вниз, только операция прибавления (исключая сторно)
    4) всегда вести лог операций, сохраняя дату, старый дебет, старый кредит, новый дебет, новый кредит, тип операции приход/расход/сторно, текстовая запись(ну еще туда же можно долепить параметры операции кому и по какому поводу)
    5) сторнирующая проводка - в логах помечаем отдельным типом, отнимаем или дебет или кредит.
    Тогда вы всегда можете по логу установить баланс и количество средств на любую операцию. Также всегда можно проконтролировать правильность роста баланса. Ну и в общем, правильная бухгалтерия.

    PS. И да, sqlite тут лучше не пользовать, он почти однопоточный - могут быть большие проблемы с одновременной записью.
    Ответ написан
    2 комментария
  • Почему API не слушает мир?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Ну он же пишет, что слушает только интерфейс 127.0.0.1
    [2017-09-18 14:31:21 +0300] [10904] [INFO] Listening at: http://127.0.0.1:8000 (10904)

    Вам нужно указать адрес опцией gunicorn --bind 0.0.0.0:8000
    Но лучше воткнуть nginx и через него проксировать на gunicorn 127.0.0.1:8000
    Ответ написан
    Комментировать
  • Как реализовать изменения конфигурационных файлов на удаленных ПК?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Как уже посоветовал DevMan - Ansible!

    У а если желанием именно питон (хотя ansible тоже питон), то есть замечательный инструмент-библиотека fabric - www.fabfile.org
    Плюсы:
    - полный питон
    - простой, как две копейки
    - можно писать сценарии, кторые будут работать со своих триггеров.
    Минусы:
    - прикручивать шаблонизатор придется самому (jinja)
    - только python2
    - нет комплексного подхода как в ансибле
    - в больших и комплексных проектах очень разрастается код.
    - нет библиотеки компонентов на все случаи, все приходится писать самим

    Как пример, у меня есть пара сотер машин с ubuntu, которые выходят на связь время от времени и устанавливают VPN. В тот момент, когда устанавливается VPN, я через fabric на них копирую новые расписания работы и доставляю небольшие обновления.

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

    Ну а если нужно комплексно управлять системами - ansible. Это когда из например удаленно нужно из сервера LAMP превратиться в сервер ELTK, со всеми зависимостями, установкой пакетов, добавление пользователей и прочей дребеденью :-)
    Ответ написан
    Комментировать
  • Как реализовать параллельный процесс с возможностью прерывания изнутри?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Так как в питоне есть gil, то любой обект как бы тредонезависимый. Воспользуйтесь https://docs.python.org/3/library/collections.html... и считайте свои подтвержденные значения. После 25 останавливайте.
    Ответ написан
    Комментировать
  • Как сделать сравнение ряда цифр на Python?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Upd... Убрал лямбду.. Исправился. Спасибо longclaps
    Анально, в две строки (нет, фактически в одну)...

    Берем отсортированный массив со второго элемента, и редусим его в выходной массив из первого элемента...

    s = sorted(list("32854"))
    def f(res, x):
       if int(x) - int(res[-1]) == 1:
         return res+[x]
       elif len(res) > 1:
         return res
       else:
         return [x]
    ret = reduce(f, s[1:], [s[0]])
    
    # напечатаем резалт
    if len(ret) > 1:
       print('Yes', ret)
    
    ### ('Yes', ['2', '3', '4', '5'])
    Ответ написан
  • Как создать xml в памяти, прикрепить его к json и отправить?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    >>> from xml.etree import ElementTree as ET
    >>> root = ET.Element("root")
    >>> ET.SubElement(root, 'b')
    >>> ET.SubElement(root, 'a')
    >>> ET.SubElement(root, 'c')
    >>> ET.tostring(root)
    '<root><b /><a /><c /></root>'
    Ответ написан
    Комментировать
  • Классы и объекты в python, self?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Так как по некоторым причинам в питоне нет контекстов и областей видимости, то функции-классов нужно передавать в явном виде ссылку на экземпляр объекта, которая и передается первым аргументом в качестве self.
    Собственно, сами классы в питоне организованы через великий dict!
    >>> class T():
    ...  def a(self):
    ...     print self.test
    ... 
    >>> a = T()
    >>> a.test =1
    >>> b= T()
    >>> b.test =2
    >>> a.a()
    1
    >>> b.a()
    2
    >>> T.a(b)
    2
    >>> T.a(a)
    1
    Ответ написан
    3 комментария
  • Каким образом выполнить множественную замену строк в файле?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Сильно не улучшить: но
    def editapache(self,replacements):
          with open(filename,'r+') as config:
            for _from,_to in replacements:
                config.replace(_from,_to)
        config.write(config)
    
    
    ....
    editapache(self,[(oldcharset,charset),(oldmail,mail),(oldname,name),("oldstring","newstring")])


    А вообще-то лучше использовать темплейты и генерировать когфигурацию из них. Посоветую например "нинзя2" - jinja.pocoo.org/docs/2.9
    А еще лучше, возьмите ansible например, в нем и jinja2 в качестве шаблонизатора в комплекте :-)
    Ответ написан
    Комментировать
  • (Python) Почему не работает условие?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Вообще-то лучше так не извращаться, а использовать CSRF для джанги (у вас же джанга?)- https://djbook.ru/rel1.7/ref/contrib/csrf.html
    Ну и если поле не задано, то должно возвращать None, проверьте на это значение.
    Ответ написан
    Комментировать
  • Какие библиотеки использовать для работы с группой файлов Python?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Для работы с группой файлов последнее время использую https://docs.python.org/3/library/pathlib.html
    Для вытаскивания информации из html рекомендую - lxml.de
    Вот статья на тему - https://habrahabr.ru/post/220125/ (pandas скорее всего вам не понадобится)
    Если есть вопросы - задавайте.
    Ответ написан
    Комментировать
  • Получение данных на сервере python (socket)?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Вы биндитесь на порт 80, на котором, похоже, у вас уже работает web-сервер. Поэтому у вас bind вылетает с ошибкой. Или поменяйте номер порта в вашем скрипте, или остановите веб-сервер.
    И что значит "callback к к моему серверу"?!
    Если вы пытаетесь из существующего веб-сервера вызвать питоновский скрипт, то бинд вам совсем не нужен, а нужно что-то типа cgi/wsgi или proxy... Но чтобы сказать точнее, нужно знать, что из себя этот ваш веб-сервер представляет, и что у него за callback api.
    Ответ написан
    5 комментариев
  • Где можно найти полный мануал для curses в Python?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    В общем, расскажу свой опыт.
    Пробовал использовать curses в питон - долго, дорого, мучительно, больно. Это совсем не python-way, увы. Я писал на curces + termlib во времена суровых зеленых терминалов на C, но и другого практически не было.
    Пробовал urwid - быстро, дешево, непрактично. Фреймворк в основном заточен на создание редакторов, отсюда есть некоторые проблемы с написанием меню-ориентированных интерфейсов. Написал на нем несколько TUI для конфигурирования.
    В результате остановился на - WEB. На питоне, например на cyclone.io, интерфейс создается за 1-3 дня для любой сложной конфигурации.
    Единственный скрипт, которые нужен именно в консоли - восстановление конфигурации по умолчанию.

    В общем рекомендую так и поступать, делайте web-конфигурилку на cyclone.io или на aiohttp.readthedocs.io . В консоли же делайте только восстановление конфигурации по умолчанию.

    Ну, или используйте urwid...

    PS. И да, на русском информации очень мало, дибо она очень старая.
    Учите язык.
    Ответ написан
  • Python Как исправить кодировку в файле для JSON?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Месяц назад тоже разбирался - https://stackoverflow.com/questions/13156395/pytho...
    Но на самом деле просто сохраняйте json в правльном UTF-8.
    Ответ написан
    Комментировать
  • Как в Python сделать скачивание генерируемого файла?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Возьмите любую интерпретацию web-сервера на питоне и отдавайте формируемый файл через него.
    Например через aiohttp (проверил, рабочий)
    from aiohttp import web
    from concurrent.futures import ThreadPoolExecutor
    import xml.etree.ElementTree as ElementTree
    
    def get_xml():
        root = ElementTree.Element('root')
        b = ElementTree.SubElement(root, 'b')
        c = ElementTree.SubElement(root, 'c')
        d = ElementTree.SubElement(root, 'd')
    
        xmlstr = ElementTree.tostring(root, encoding='utf8', method='xml')
        return xmlstr
    
    async def handle(request):
        with ThreadPoolExecutor() as executor:
            xmlstr = await request.app.loop.run_in_executor(executor, get_xml)
        return web.Response(body=xmlstr, content_type="text/xml")
    
    app = web.Application()
    app.router.add_get('/', handle)
    
    web.run_app(app, port=8080)
    Ответ написан
    Комментировать
  • Как узнать число запущенных потоков?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Нет, это не очень хорошо. Вам желательно использовать легкие (green) треды и/или event pool. Иначе, при большом количестве клиентов уткнетесь в ограничения по количеству тредов.
    Посмотрите на асинхронные библиотеки типа aiohttp или twisted cyclone.io.
    Ответ написан
    4 комментария
  • Зачем goto в исходниках Python?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Как ни странно, я тоже в свое время считал, что goto плохо и дурной вкус. Нет, не плохо! Иногда читаемость, как в данном примере, повышается на порядок. И goto плохо там, где его неправильно применяют.
    Более того, внутри любой цикл все равно раскладывается на jmp и br :-)
    Так что все зависит от квалификации и применения.
    Goto перестали рекомендовать, из-за того, что очень просто с ним пропустить освобождение чего-то важного. Так что новичкам его лучше не пользовать, это очень точный инструмент.
    From: Linus Torvalds
    Subject: Re: any chance of 2.6.0-test*?
    Date: 	Sun, 12 Jan 2003 11:38:35 -0800 (PST)
    
    On Sun, 12 Jan 2003, Rob Wilkens wrote:
    > 
    > I'm REALLY opposed to the use of the word "goto" in any code where it's
    > not needed.
    
    I think goto's are fine, and they are often more readable than large
    amounts of indentation. That's _especially_ true if the code flow isn't
    actually naturally indented (in this case it is, so I don't think using
    goto is in any way _clearer_ than not, but in general goto's can be quite
    good for readability).
    
    Of course, in stupid languages like Pascal, where labels cannot be 
    descriptive, goto's can be bad. But that's not the fault of the goto, 
    that's the braindamage of the language designer.
    
    		Linus
    Ответ написан
  • Как в Elasticsearch (python) явно прописывать тип поля (keword) при создании документа?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Как уже написали, нужно сделать маппинг на ваши поля. В дополнение можно еще к каждому полю сделать fields https://www.elastic.co/guide/en/elasticsearch/refe...
    Ответ написан
    Комментировать
  • Как собрать установочный пакет на Linux для Linux?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    0) Желательно все упаковать в virtuelenv, если используете pip. Или использовать стандартные пакеты системы.
    1) Создаете каталог для своего пакета, например myservice-0.001
    2) Кидаете все свои исходники в этот каталог, пути ставите, как они у вас будут в целевой системе
    Например:
    etc/systemd/system/myservice.service
    opt/myservice/...
    opt/.myservice-venv/...
    usr/bin/myservice

    И т.д.
    3) Создаете там же каталог DEBIAN, в него кладете файл control - https://www.debian.org/doc/debian-policy/ch-contro...
    , и файл postinst (опционально) - https://www.debian.org/doc/debian-policy/ch-mainta...

    В control описываете свои зависимости и название пакета, какие пакеты замещает
    postinst - исполняемый, запускается после установки пакета, пользхователей там создать, сервис запустить и т.д.
    root@xxx:~/xxx-2.40# cat DEBIAN/control
    Package: xxx
    Version: 2.40
    Section: custom
    Priority: optional
    Architecture: all
    Essential: no
    Installed-Size: 171700
    Maintainer: xxx.ru
    Description: XXX DS system
    Depends: samba, isc-dhcp-server, python-twisted, libdate-manip-perl, libio-socket-multicast-perl
    Replaces: isc-dhcp-server, samba
    Recommends: sudo, vim, nano

    и
    root@xxx:~/xxx-2.40# cat DEBIAN/postinst
    #!/bin/sh
    # postinst script for webpy-example
    #
    # see: dh_installdeb(1)
    
    set -e
    
    # summary of how this script can be called:
    #        * <postinst> `configure' <most-recently-configured-version>
    #        * <old-postinst> `abort-upgrade' <new version>
    #        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
    #          <new-version>
    #        * <postinst> `abort-remove'
    #        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
    #          <failed-install-package> <version> `removing'
    #          <conflicting-package> <version>
    # for details, see http://www.debian.org/doc/debian-policy/ or
    # the debian-policy package
    
    # source debconf library
    . /usr/share/debconf/confmodule
    
    case "$1" in
    
      configure)
        adduser --quiet --system --home /inbox  xxx || echo "User xxx existed!"
        usermod -p yyyy xxx
        (echo new123; echo new123) | smbpasswd -as xxx
        smbpasswd -e xxx
        systemctl enable xxx
        systemctl start xxx
      ;;
    
      abort-upgrade|abort-remove|abort-deconfigure)
        exit 0
      ;;
    
      *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
      ;;
    
    esac
    
    # dh_installdeb will replace this with shell code automatically
    # generated by other debhelper scripts.
    
    #DEBHELPER#
    
    db_stop
    exit 0

    4) идете на каталог ниже и выполняете
    dpkg-deb --build myservice-0.001
    Рядом получаете файло myservice-0.001.deb

    Доне.

    PS.Про иконки и прочее отдельно читайте, этого я вам не скажу.
    Ответ написан
    Комментировать