Подтвердить что ты не робот

Зафиксируйте python script для каждой ОС

В последние несколько лет я написал небольшую небольшую программу на python, и теперь я хотел бы ее распространять, но моя первая попытка не вызвала большого энтузиазма, поскольку многим потенциальным пользователям не понравилась идея загрузки и установки python и всех зависимостей, необходимых для запуска моего приложения.

Я несколько недель искал решение для компиляции своего кода во что-то легкое для запуска для всех, но я не очень доволен тем, что нашел.

У меня нет проблем с идеей замораживания приложения, а не для его компиляции. Это просто означает, что конечный пользователь будет ждать несколько секунд, чтобы загрузить приложение и займет больше места на своем жестком диске.

Моя проблема заключается в том, чтобы найти способ упаковать все приложения в исполняемый файл для каждой ОС (пусть говорят большие: windows, mac, linux - очевидно, другой исполняемый файл для каждой ОС) без необходимости установки виртуальных машин или вино или аналогичные варианты. Я сильно подозреваю, что это возможно, так как я видел кучу игр ren'py, упакованных точно так, как я хотел бы упаковать свое приложение, но я не знаю, как получить тот же результат для моей программы.

Схематически для моего приложения требуется консоль для запуска и включает несколько домашних пакетов, numpy и matplotlib. Он также имеет систему поддержки нескольких языков, которая динамически включает языковой файл, перезаписывая предыдущие настройки:

exec('from lang.%s import lang' % language)

Я подозреваю, что это может создать некоторые проблемы. Наконец, программе требуется несколько папок для сохранения ее настроек, журналов и т.д. В первом запуске, поэтому они также должны быть включены. Мой компьютер запускает ubuntu mate 16.10 (x64), а версия python - 2.7, но в будущем я планирую перевести его на python 3. Созданные исполняемые файлы могут быть одиночными тяжелыми файлами, которые содержат почти все необходимые или легкие файлы, а все остальное может быть найденный в ближайшей папке; Я действительно не предпочитаю одно решение или другое.

Я знаю, что этот вопрос возникает время от времени и, вероятно, уже был дан ответ, но последнее появление такого вопроса, которое я мог найти, датируется 2014 годом, которое звучит как эоны назад, если мы рассмотрим, как быстро меняются вещи в этом поле.

Изменить. Поскольку, как представляется, нет решения с условиями, которые я предложил, я могу подумать о настройке некоторого уровня эмуляторов/обертки/совместимости/для запуска морозильника для разных ОС, но я "Не знаю, что делать. Я читал здесь и там, что вино не всегда работает должным образом и не может найти ничего для компиляции для mac на linux. Насколько я понимаю, программа не должна требовать другой компиляции для 32/64 бит систем, но если есть простой способ для компиляции для каждой возможности, было бы хорошо. Виртуальные машины по-прежнему не идут, прямо сейчас у меня нет места на моем диске для настройки двух или более виртуальных машин (что является большим недостатком ssd-дисков...), не говоря уже о оплате лицензий на ОС, которые используется несколько раз в год для компиляции бесплатного программного обеспечения.

4b9b3361

Ответ 1

Так как я еще не видел этого здесь, я думал, что воспитываю Докера. Кажется, это распространяемая виртуальная машина, которая содержит пакет или приложение какого-либо типа. Существует бесплатная версия сообщества, доступная на github https://github.com/docker/docker. Я никогда не использовал его сам, но, похоже, он соответствовал всем вашим критериям - легким, свободным и платформенным агностиком. Просто что-то для изучения.

Ответ 2

Сначала пара.

  • Python уже является межплатформенным
  • Код Python интерпретируется, а не изначально компилируемый язык и не нуждается в компиляции
  • Существуют стандартные методы в Python setuptools для распространения исполняемых скриптов с кросс-платформенной совместимостью
  • Сторонние библиотеки python могут включать в себя собственный код (на C), который либо будет нуждаться в компиляции при установке, либо для бинарных пакетов, которые были доступны поддерживателям пакетов. NumPy и matplotlib относятся к этой категории и имеют бинарные пакеты, доступные для окон AFAIK.

Вот пример кода setup.py для установки исполняемого файла script:

from setuptools import setup, find_packages
setup(<...>,
      entry_points={'console_scripts': [
          '<console cmd name here> = my_package.module:main'
]})

Где my_package.module, например

my_package/module.py:

<..>
def main():
    <what to run when <console cmd name here> is executed>

Затем пакет можно распространять как стандартный модуль python, устанавливаемый через pip. Если код является открытым исходным кодом, его можно разместить на PyPi (см. Инструкции на сайте PyPi для настройки).

В противном случае исходный или двоичный пакет колес (python setup.py sdist и python setup.py bdist_wheel соответственно) могут быть созданы и распространены среди ваших пользователей.

Двоичные колеса должны быть построены на платформе, на которой они должны быть установлены, исходные дистрибутивы будут работать на любой платформе, но потребует, чтобы код выполнялся при установке, поскольку они содержат чисто исходный код.

Обратите внимание, что для сборки/установки бинарных колесных пакетов требуется pip version >= 6.0 и setuptools >= 26.0.

Когда этот пакет установлен, консольное имя cmd здесь > исполняемый файл будет доступен для запуска на всех платформах, пакет может быть успешно установлен.

Для простого примера, который делает это, см. hello-world-python-package, в частности его setup.py.

Подробнее о бинарных пакетах колес см. сайт pythonwheels.

Ответ 3

Единственная платформа, которая ожидает, что программы будут автономным пакетом, - ms-windows. Это в основном по историческим причинам, относящимся к родной toolchain. Например, до версии 2016 ms-toolchain (IIRC) модули расширения Python, такие как numpy, должны быть скомпилированы с точно такой же версией ms-toolchain, что и сам Python. Это делает создание модулей расширения для ms-windows огромной болью.

Большинство UNIX-подобных операционных систем имеют функциональное управление пакетами (хотя в Apple OS-X это поставляется сторонним). Это упрощает установку Python.

Что может быть полезно, чтобы упаковать ваше приложение в zip файл, например youtube-dl. Я написал script, называемый build.py, который делает это для некоторых моих программ.

Ответ 5

Я не знаю, что вы на самом деле делаете, написав приложение "замораживание", но если я это понимаю, вам нужно скомпилировать свой код в установщик, который просто устанавливает все библиотеки и файлы, необходимые для запуска вашей программы, поэтому он может обращаться с любым пользователем компьютера noob.

Ok. Теперь у вас есть два варианта:

A) Сделайте установщик для каждой системы отдельно. Вы можете использовать такие инструменты, как Inno setup или PackageBuilder ( на mac), чтобы создать установщик, проверить, установлен ли python (если он не установлен) и скопировать ваши файлы + сделать ярлык на рабочем столе (или что-то в этом роде) + запустить внешние скрипты (если вам нужно) или если вам нужны бинарные файлы для окон вы можете использовать Py2exe или на mac Py2app. В Linux нет ничего подобного, но если кто-то использует Linux, то обычно это продвинутый пользователь.

Если я знаю, что нет ничего особенного, как автоматический строитель для всех платформ для создания инсталляторов python, но если у вас есть деньги, вы можете увеличить свою работу с помощью Bitrock Install Builder.

B) Создайте свой собственный script. Если у пользователя уже есть python, вы можете сделать script для загрузки и установки файлов вручную (по моему лучшему решению, если продукт создан для продвинутых пользователей, но если вы сделаете некоторый GUI, это не будет проблемой для noob)

Ответ 6

Ren'Py

Несколько раз упоминайте Ren'Py. Документация описывает, как добавить код Python в игру. В разделе Python Statement описывается как добавить пакеты сторонних разработчиков (например, numpy и matplotlib). Он может генерировать файлы для Windows, Mac и Linux. Если вы можете заставить его запустить приложение так, как вы хотите, и вы уже знакомы с ним, то вы должны его использовать.

PyInstaller

Другим вариантом является PyInstaller. В разделе Поддержка нескольких операционных систем говорится следующее:

Если вам необходимо распространять ваше приложение для более чем одной ОС, например, Windows и Mac OS X, вы должны установить PyInstaller на каждой платформе и объединить свое приложение отдельно.

Второй абзац описывает, как это сделать на одной машине:

Вы можете сделать это с одной машины с помощью виртуализации. Бесплатный виртуальный бокс или платные VMWare и Parallels позволяют запускать еще одну полную операционную систему в качестве "гостя". Вы настраиваете виртуальную машину для каждой гостевой ОС. В нем вы устанавливаете Python, пакеты поддержки, необходимые вашему приложению, и PyInstaller.

PyInstaller рекламирует поддержку numpy и matplotlib.

Виртуальные машины и размещенные операционные системы

Вы сказали, что у вас нет места на вашем SSD для виртуальных машин. Вы можете купить внешний жесткий диск USB и сохранить на нем виртуальные машины. Или вы можете использовать хостинг-провайдера операционной системы. Вы можете использовать Google, чтобы узнать больше об этом. Если у вас есть вопросы о том, как использовать конкретного хостинг-провайдера, вы должны создать новые вопросы.

Тестирование Cross Platform

Даже если вы используете Ren'Py, вам почти наверняка нужно будет проверить результаты на виртуальных машинах или размещенных операционных системах. Единственный способ убедиться, что ваша программа будет корректно работать на других платформах, - это протестировать ее на этих платформах. Решение для хостинга позволяет избежать оплаты лицензий на ОС, которые будут использоваться несколько раз в год для компиляции бесплатного программного обеспечения. Тем не менее, вы все равно будете тратить деньги на хостинг.

Цена бесплатного

Если ваша цель - разработать приложения Python для Windows, Mac и Linux, не тратя ни денег, то вы, вероятно, застряли с Ren'Py и полагаетесь на пользователей, чтобы помочь вам протестировать приложение в своих операционных системах.

Ответ 7

Начальная реакция

  • Для Windows используйте p2exe
  • Для использования linux python freeze
  • Для macos использовать то же самое замораживание - должно работать (просто догадка, поднятая только одним поиском google)

(изменения могут потребоваться для вашей программы, например, __file__ не могут быть использованы)


Возможный альтернативный подход к исходной проблеме

<... > не испытывал большого энтузиазма, поскольку многие потенциальные пользователи не как идея загрузки и установки python

Возможно, пользовательские возражения могут быть вылечены, включив в себя программу установки python рядом с вашей программой. (либо фактический установщик python, либо http://portablepython.com/)
т.е. добавить не только ссылку на установщика, но и всех инсталляторов и, возможно, скриптов bat/sh, чтобы установить все.

Ответ 8

На работе я делаю что-то вроде того, что вы хотите, и в итоге я написал свой собственный код, чтобы сделать это. Все построено на Linux, но я поставляю как пакеты Linux, так и Windows. Пакеты включают в себя интерпретатор и библиотеку Python, и они одинаково работают независимо от того, установлен ли клиент уже на Python.

По сути, вам нужна небольшая программа, которая внедряет интерпретатор Python и устанавливает ее для загрузки только кода Python, который вы отправляете, игнорируя любой установленный системой Python. Написанная правильно, эта программа может быть скомпилирована для каждой архитектуры, которую вы хотите поддерживать. Затем вы отправляете библиотеки DLL Python, необходимые для архитектуры, а также zip файл с кодом Python, который вы будете использовать (вам нужны только файлы .pyc или .pyo). Этот zip файл должен также содержать как можно больше стандартной библиотеки.

Предостережения:

  • Вам все равно понадобятся виртуальные машины для тестирования.
  • Настройка кросс-компиляторов C для каждой архитектуры может быть сложной задачей.
  • Ни Python site.py, ни тот, который использует virtualenv, полностью изолирует вас от установки Python системы. Я должен был сделать свою собственную версию site.py.
  • Легко связать с системой Python по ошибке. Будьте очень осторожны с тем, как вы используете аргументы pkg-config и компилятора в сценариях сборки.
  • Для Python легко попытаться загрузить библиотеку Python системы по ошибке. Будьте очень осторожны при настройке пути Python и, возможно, Py_IgnoreEnvironmentFlag.
  • Для Windows вы можете получить довольно далеко от py2exe, и это будет проще, чем я предлагаю. Я не использую py2exe главным образом потому, что я внедряю код Python в приложение, отличное от Python.

Поскольку мое приложение находится в Go с некоторым Python, я написал свою оболочку в виде пакета Go, который вызывает код PGI-кода Python через cgo. Вы можете увидеть большую часть кода внедрения Python здесь. Однако это репо - это не вся история: скрипты для пользовательской сборки Python и скрипты сборки и код инициализации для самого приложения не являются общедоступными.