LINUX.ORG.RU

Python3.6 под дебиан stable и pyinstaller

 , ,


0

1

Написал софт на питоне. Либа npyscreen противная, ей нужен питон не моложе 3.6, попытки поставить таковой из исходников ни к чему не привели (зависает на test fault_handlers). Но не в этом дело, питон 3.6 я поставил через pyenv. Дело в том, что он там кривой какой-то, и pyinstaller из под него не работает. Что я предпринял: поставил виртуалку с кали (да я шизоид), там поставил питон из исходников (там он почему-то отлично установился!). Но вижу все ту же ошибку:

python3.6 -m pyinstaller --onefile main.py
python3.6: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

На коренном дебиане, из-под pyenv’а, это звучало так:

OSError: Python library not found: libpython3.6m.so.1.0, libpython3.6mu.so.1.0, libpython3.6.so, libpython3.6m.so, libpython3.6.so.1.0
    This means your Python installation does not come with proper shared library files.
    This usually happens due to missing development package, or unsuitable build parameters of the Python installation.

Как я могу все-таки скомпилить (*собрать интерпретируемый код) свой код с версией питона 3.6?

Ответ на: комментарий от x3al

А по-русски? Я и так юзал pyenv. Я должен получить исполняемый файл. Который не стадно выложить в релиз на гитхабе, тоже желательно.

Yarosvet
() автор топика
Последнее исправление: Yarosvet (всего исправлений: 1)

противная, ей нужен питон не моложе 3.6

Питон 3.6 не поддерживается. В том числе явно не поддерживается pyinstaller’ом. Выкидывай эту npyscreen, зачем использовать абандонварь? Ну и да, вместе с этим не нужно пытаться распространять софт в бинарниках. В релизе на github не должно быть ничего кроме git тэга.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

python3.6: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

Ты перевёл её на русский? Пытался разобраться? Файл искал?

firkax ★★★★★
()
Ответ на: комментарий от Yarosvet

Поставил через гит, отлично работает, питон 3.9! Катаю релиз

Ты серьёзно? Релиз с либой из гита? Хуяк-хуяк и в продакшен? Не, бывает что прям надо, но лучше не стоит

upcFrost ★★★★★
()
Ответ на: комментарий от Yarosvet

Несколько замечаний по коду, стилю и организации.

Утилита предлагает хранить пароли к хостам в открытом виде. Это очень плохо.

В 2022 году проект на Python должен как минимум иметь flake8 и mypy в pre-commit хуках и в CI/CD.

l = list(sorted(list(session.query(Connection)), key=lambda x: x.id))

При получении данных из SQL БД всегда надо сортировать на стороне источника. Зачем делать это в Python? А дальше что будет — фильтровать на стороне Python? Впрочем, я и такое видел.

К чему эти вложенные повторения list(sorted(list))? Прежде чем писать даже маленькую утилиту, надо сначала изучить основы языка. Что такое списки, итераторы, генераторы.

        for i in range(len(l)):
            res["[{}] {}".format(i + 1, l[i].name)] = l[i].id

enumerate и f-strings сделали бы этот код намного более читаемым.

if os.path.exists("data/pem/{}.pem".format(e.id)):

Функции os.path.* устарели, pathlib более удобна и читаема.

            if name:
                e.name = name
            if ip:
                e.ip = ip
            if port:
                e.port = port
            if auth:
                e.auth = auth

Без кучи этих условий не то же ли самое окажется в итоге в базе?

from config import *

Star-импортов не должно быть нигде и никогда!

s = pexpect.spawnu(f"chmod 600 {pem_path}")

А встроенный os.chmod чем не угодил? И зачем запускать неинтерактивный процесс через pexpect?

Дальше устал читать.

emorozov
()
Ответ на: комментарий от qaqa

Эта фигня делается вообще без python и баз, прописыванием хостов с параметрами в ~/.ssh/config.

Я так понимаю, человеку хотелось сделать пет-проект. Но до production-ready он пока явно не дотягивает.

emorozov
()
Ответ на: комментарий от emorozov

Спасибо! Я редко вижу нормальный чужой код, поэтому часто придумываю свои велосипеды. Касательно list(sorted(list)) это при моем психическом диагнозе нормально, я после олимпиадного программирования. Так проблем меньше возникает с методами списка потом. Привык однако, теперь везде леплю так. Касательно открытых паролей - да, я знаю, позже планирую шифровать все надежно. Но позже, а пока мне нужна тулза на скорую руку. Спасибо за код ревью, еще раз (= Одного не понимаю, чем тебе не понравилась звездочка. когда я импортирую параметры из собственного конфиг-файла.

Yarosvet
() автор топика
Ответ на: комментарий от Yarosvet

Насчёт олимпиадного программирования сомневаюсь, ибо смотри, что ты делаешь:

  1. Читаешь несортированные данные из SQLite
  2. Создаёшь из них список.
  3. Создаёшь копию отсортированного списка.

Это чудовищно неэффективно на каждом этапе по потреблению процессора и памяти, а олимпиадное программирование вроде бы заточено на эффективность.

Во-первых, в любом случае, в разы эффективнее сортировать/фильтровать данные из БД сразу в SQL (WHERE/ORDER BY), нежели засасывать все их в процесс на Python, и фильтровать/сортировать в нём. Когда/если ты начнёшь писать реальный код, ты однажды втянешь из продовой таблицы миллионы строк, чтобы выделить из них пяток-другой, и жизнь очень больно ударит тебя линейкой по рукам, когда в проде твой процесс начнет либо умирать по OOM, либо простейшие действия пользователя будут выполняться минутами.

Во-вторых, у тебя двойное копирование/преобразование списка (два раза list), это лишнее, даже если тебе действительно нужен список. Достаточно было бы одного из двух:

  1. Создать список из сортированных данных: list(sorted(cursor.fetchall()))
  2. Создать список и отсортировать in-place: my_cool_list.sort()

Одного не понимаю, чем тебе не понравилась звездочка. когда я импортирую параметры из собственного конфиг-файла.

Читателям твоего кода или тебе самому через месяц будет непонятно, что импортируется. К тому же, стар-импорты со временем всегда приводят к диким конфликтам кода. Всегда. Через месяц-два, будешь редактировать код и случайно забудешь, что у тебя уже используется определенное имя. Тем люди от компьютеров и отличаются, что даже лучшие забывают.

Если лень перечислять, то можно импортировать модуль целиком, типа:

from settings import config

connect(config.SQLITE_DB)
emorozov
()