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

Как мы можем создавать и распространять скрипты python в среде Windows?

Моя команда наслаждается использованием python для решения проблем для нашего бизнеса. Мы пишем много небольших независимых сценариев.

Однако мы должны иметь центральное окно, которое запускает их вместе с устаревшими приложениями.

Наша задача заключается в процессе сборки и развертывания.

Мы хотим, чтобы Bamboo проверил script из git, установил требования и выполнил тесты, а затем, если все зеленые, просто установите их в нашу производственную коробку.

Мы хотели бы, чтобы библиотеки были изолированы от script до script, поэтому у нас нет проблем с зависимостями.

Мы пытались заставить virtualenvs быть переносимыми, но это, похоже, не идет.

Pex выглядел многообещающим, но он не работает на окнах.

В идеале вы увидите такую ​​папку:

AppOne
  /Script.py
  /Libs
    /bar.egg
    /foo.egg
AppTwo
  /Script2.py
  /Libs
    /fnord.egg
    /fleebly.py

Мы думаем об этом неправильно? Какой питонический способ распространения скриптов внутри предприятия?

4b9b3361

Ответ 1

TL: DR:
Используйте Docker


Краткая история:

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

Вы можете установить python image (slim самый легкий) в качестве базовой среды для каждого script или группы сценариев/приложений и использовать его как "virtualenv", в котором вы можете установить все ваши зависимости для этого script.

Существует также интеграция для Bamboo и Docker, которые могут оказаться полезными.

Ниже приведена документация Docker.

Вы можете протестировать каждый script отдельно в отдельном контейнере, и если он пройдет, вы можете использовать тот же контейнер для его развертывания на своем основном сервере.

Это не совсем то, о чем вы просите, но вы можете использовать это решение на каждой платформе (Windows, Linux и т.д.), вы можете развернуть все свои сценарии на корпоративном сервере (или где угодно, если на то пошло) и использовать их через вашу компанию.


Отказ от ответственности: Это не решение, это решение, о котором я знаю, относится ко времени ответа (2017)

Ответ 2

Вы можете сделать это с помощью аккуратной, если относительно неизвестной функции, которая была прокрался в Python 2.6 без особого шума: выполнение zip файлов в качестве приложений Python. Он получил немного (чуть-чуть) больше рекламы после PEP 441 (который вдохновляет PEX), хотя я думаю, что большинство люди до сих пор не знают об этом. Идея заключается в том, что вы создаете zip файл (рекомендуемое расширение .pyz или .pyzw для оконных приложений, но это, очевидно, не важно) со всем кодом и модулями, которые вы хотите, а затем просто запускаете его с помощью Python. Интерпретатор добавит содержимое zip файла в sys.path и ищет модуль верхнего уровня с именем __main__ и запустит его. Python 3.5 даже представил удобный модуль zipapp для создания таких упакованных приложений, но в этом нет никакой магии, и вы также можете создавать это вручную или script.

В вашем случае, я думаю, Bamboo может выполнить проверку, установку и тестирование зависимостей в virtualenvs, а затем пакетное приложение вместе с библиотеками среды. Это не решение с одним кликом, но оно может сделать трюк без дополнительных инструментов.

Ответ 3

Другая возможность - pyinstaller. Он создает исполняемый файл, который может быть развернут. Python даже не требуется устанавливать на развернутую производственную коробку. Сложнее отлаживать проблемы, возникающие только в развернутом поле. Вы также не можете изменять сценарии в развернутом поле, которое в зависимости от вашего доверия владельцев машины является положительным или отрицательным. См. http://www.pyinstaller.org/

Ответ 4

Как я понимаю, вы хотите создать автономные каталоги приложений на сервере сборки, а затем скопировать их на производственный сервер и запустить скрипты непосредственно из них. В частности, вы хотите, чтобы все зависимости (ваши собственные и внешние пакеты) были установлены в подкаталоге Libs в каждом каталоге приложений. Здесь достаточно надежный способ сделать это:

  • Создайте каталог приложений верхнего уровня (AppOne) и подкаталог Libs внутри него.
  • Используйте pip install --ignore-installed --target=Libs package_name для установки зависимостей в подкаталоге Libs.
  • Скопируйте собственные пакеты и модули в подкаталог Libs (или установите их там с помощью pip).
  • Скопируйте Script.py в каталог верхнего уровня.
  • Включите код вверху Script.py, чтобы добавить каталог Libs в sys.path:

    import os, sys
    app_path = os.path.dirname(__file__)
    lib_path = os.path.abspath(os.path.join(app_path, 'Libs'))
    sys.path.insert(0, lib_path)
    

Это сделает пакеты типа Libs\bar.egg и модули типа Libs\fleebly.py доступными для вашего script через import bar или import fleebly. Без кода, подобного этому, вы не сможете найти script эти пакеты и модули.

Если вы хотите оптимизировать эту часть своего script, есть несколько вариантов: (1) Поместите эти строки в отдельный модуль fix_path.py в каталог верхнего уровня и просто вызовите import fix_path на начало вашего Script. (2) Создайте файл Libs\__init__.py с линией sys.path.insert(0, os.path.dirname(__file__)), а затем вызовите import Libs из вашего Script. После этого Libs\x можно импортировать через import x. Это опрятно, но это нестандартное использование механизмов пакета и пути (он использует Libs как каталог библиотеки, так и пакет), поэтому он может создать некоторую путаницу в отношении того, как работает импорт.

Как только эти каталоги и файлы будут установлены, вы можете скопировать всю эту структуру в любую систему Windows с установленным Python, а затем запустить ее с помощью cd AppOne; python Script.py или python AppOne\Script.py. Если вы назовете script __main__.py вместо Script.py, то вы можете запустить приложение, выполнив python AppOne.

Кроме того, как отметил @jdehesa, если ваш script имеет имя __main__.py, вы можете сжать содержимое каталога AppOne (но не самого каталога AppOne) в файл с именем AppOne.zip, а затем скопируйте его на ваш производственный сервер и запустите его, вызвав python AppOne.zip. (На Python 3.5 или более поздней версии вы также можете создать zip файл через python -m zipapp AppOne, если ваш script называется __main__.py. Вы также можете использовать python -m zipapp AppOne -m Script, если ваш script называется Script.py. См. https://docs.python.org/3/library/zipapp.html.)

Ответ 5

Этот вид вещей можно легко решить с помощью python setup.py

Пример setup.py

from setuptools import setup

setup(
    name=name_for_distribution,
    version=version_number,
    py_modules=[pythonfiles],
    install_requires=[
        python packages that need to be installed
    ]
)

Создайте виртуальную среду, активируйте ее и запустите: Установка python setup.py

Я считаю, что это самый пифонический способ распространения и упаковки вашего проекта.

Чтение ссылок:

https://pythonhosted.org/an_example_pypi_project/setuptools.html https://docs.python.org/2/distutils/setupscript.html