Как мне создать и загрузить файл egg в Python?

Я ищу способ распространения модуля python в виде одного файла egg. Предположим, у меня есть модуль Python под названием my_module и я хочу написать скрипт на python, который генерирует файл egg для моего модуля. Итак, я нашел setuptools,

from setuptools import setup

setup(
    name="my_module",
    packages=[my_package],
    version="1.0",
)

И у меня были некоторые недостатки в отношении этих вопросов:

  1. Этот скрипт должен быть запущен как python setup.py install, Другими словами, мне нужно указать аргументы командной строки. Вместо этого я хочу автоматически генерировать мой egg-файл во время написания кода на python, который имеет собственный контроль над аргументами командной строки.
  2. Полученные файлы передаются в каталог файлов установки. Я хотел бы контролировать путь к выходному каталогу в скрипте.
  3. Скрипт создания build а также dist папки, которые мне на самом деле не нужны. Возможно, я мог бы решить это, удалив папки после звонка setup,

Как я должен использовать setuptools для моих целей, охватывающих вопросы выше?

А также, как я могу загрузить свой модуль из указанного файла egg?


Предположим, у меня есть следующий модуль:

# my_module.py

class MyClass:
    def __init__(self):
        self._x = None

    def set_x(self, x):
        self._x = x

    def get_x(self):
        return self._x

Я написал этот скрипт для создания яичного файла:

# create_egg.py

from setuptools import setup

setup(
    name="my_module",
    packages=['my_module'],
    version="1.0",
)

Я получаю такую ​​ошибку при запуске creage_egg.py:

$ python3 create_egg.py
usage: create_egg.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: create_egg.py --help [cmd1 cmd2 ...]
   or: create_egg.py --help-commands
   or: create_egg.py cmd --help

error: no commands supplied

1 ответ

Решение

Первое, что я узнал, это то, что пакет должен быть каталогом. Поэтому необходимо сохранить такую ​​структуру:

my_project/
    my_module/
        __init__.py
    output/
    create_egg.py
test_egg.py

Чтобы пропустить необходимость указания аргументов командной строки, есть специальная опция script_args, Я нашел это здесь: http://peak.telecommunity.com/DevCenter/setuptools

мой __init__.py:

class MyClass:
    def __init__(self):
        self._x = None

    def set_x(self, x):
        self._x = x

    def get_x(self):
        return self._x

мой create_egg.py:

import os
import shutil
from setuptools import setup


OUTPUT_DIR = 'output'


if __name__ == "__main__":
    setup(
        name="my_module",
        packages=['my_module'],
        version="1.0",
        script_args=['--quiet', 'bdist_egg'], # to create egg-file only
    )

    egg_name = os.listdir('dist')[0]

    os.rename(
        os.path.join('dist', egg_name),
        os.path.join(OUTPUT_DIR, egg_name)
    )

    shutil.rmtree('build')
    shutil.rmtree('dist')
    shutil.rmtree('my_module.egg-info')

мой test_egg.py:

import sys
sys.path.append('my_project/output/my_module-1.0-py3.5.egg')

import my_module


obj = my_module.MyClass()
obj.set_x(29)
print(obj.get_x())

Создание яичного файла:

~/Stuff/my_project $ python3 create_egg.py 
zip_safe flag not set; analyzing archive contents...

Тестирование модуля:

~/Stuff $ python3 test_egg.py 
29
Другие вопросы по тегам