Как создать модуль python


Создать модуль python можно на основе одного единственного скрипта. Модуль можно будет разместить на PyPI, откуда его смогут скачивать и использовать другие разработчики.



Создать модуль python


Основу тестового модуля будет представлять один скрипт. Он принимает первый аргумент командной строки и удваивая выводит в консоль.


mcedit dubler.py

#!/usr/bin/python3

import sys
argument = sys.argv[1]
argument = str(argument)
print (2 * argument)


Пример использования получившегося модуля


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

python3 /tmp/dubler.py some

somesome

python3 /tmp/dubler.py «some «

some some



Создание дистрибутива для модуля


Модуль собирается из самих скриптов (в примере он один) и файла с метаданными. На выходе ожидаем получить модуль с более сложной структурой



Создаем каталог

mkdir dubler && cd dubler



В каталоге нужен написанный ранее скрипт

cp ../dubler.py .



Добавляем setup.py, который будет содержать метаданные

mcedit setup.py

from distutils.core import setup

setup(

name = 'dubler',
version = '1.0.0',
py_modules = ['dubler'],
author = 'me',
author_email = '[email protected]',
url = 'http://example.com',
description = 'simple app',
)


Теперь можно собрать дистрибутив (он же модуль)

python3 setup.py sdist

writing manifest file 'MANIFEST'
creating dubler-1.0.0
making hard links in dubler-1.0.0…
hard linking func.py -> dubler-1.0.0
hard linking setup.py -> dubler-1.0.0
creating dist
Creating tar archive
removing 'dubler-1.0.0' (and everything under it)



Устанавливаем модуль для локальной копии python выполняя с реквизитами суперпользователя

python3 setup.py install

copying build/lib/dubler.py -> /usr/local/lib/python3.6/dist-packages
byte-compiling /usr/local/lib/python3.6/dist-packages/func.py to dubler.cpython-36.pyc
running install_egg_info
Writing /usr/local/lib/python3.6/dist-packages/dubler-1.0.0.egg-info



Содержимое каталога

ls

build dist func.py MANIFEST setup.py



В скриптах теперь можно использовать модуль dubler после того, как добавлен импорт: import dubler

Если в модуле существуют функции, импортировать их можно отдельно from dubler import somefunc



В скрипте это позволит вызывать функцию как somefunc вместо dubler.somefunc() . Но, такой импорт может перезаписать данные из текущего namespace. Т.е. определение функции с тем же именем до импорта.



Модули можно не устанавливать, а разместить там, где их ищет система

> import sys; sys.path

[», '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']



Всегда есть возможность загрузить дистрибутив на PyPI дав к нему общий доступ. Предварительно нужно на данном ресурсе зарегистрироваться.

python3 setup.py register

python3 setup.py sdist upload



Для своих модулей со структурой хотя бы немного более сложной, чем приведенная следует использовать if __name__ == '__main__'.

Сказать спасибо