Как мне создать и загрузить файл egg в Python?
Я ищу способ распространения модуля python в виде одного файла egg. Предположим, у меня есть модуль Python под названием my_module
и я хочу написать скрипт на python, который генерирует файл egg для моего модуля. Итак, я нашел setuptools
,
from setuptools import setup
setup(
name="my_module",
packages=[my_package],
version="1.0",
)
И у меня были некоторые недостатки в отношении этих вопросов:
- Этот скрипт должен быть запущен как
python setup.py install
, Другими словами, мне нужно указать аргументы командной строки. Вместо этого я хочу автоматически генерировать мой egg-файл во время написания кода на python, который имеет собственный контроль над аргументами командной строки. - Полученные файлы передаются в каталог файлов установки. Я хотел бы контролировать путь к выходному каталогу в скрипте.
- Скрипт создания
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