09. Модули

09. Модули

09. Модули

15 април 2015

Модули 101

.pyc

import

В този ред на мисли, показвали ли сме ви това:

import __hello__

Модули

from module import a, b, c
a()

Модули

from module import a, b, c
a()

from module import a as b
b()

Модули

from module import a, b, c
a()

from module import a as b
b()

from django.contrib.auth.models import User
my_user = User()

Модули

from django.db import models
my_model = models.Model()

Модули

import datetime
now = datetime.datetime.now()

if __name__ == "__main__":

Така можете да сте сигурни, че текущият файл е изпълнен, а не импортнат

Search Path

>>> import sys
>>> sys.path
[
'',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-linux',
'/usr/lib/python3.4/lib-dynload',
'/usr/lib/python3.4/site-packages',
]

dir()

Връща списък със всички имена в модул

import sys
dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__',
'__loader__', '__name__', '__package__', '__spec__', '__stderr__',
'__stdin__', '__stdout__', '_clear_type_cache', '_current_frames',
'_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions',
'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix',
'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'getallocatedblocks', 'getcheckinterval',
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding',
'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof',
'getswitchinterval', 'gettrace', 'hash_info', 'hexversion',
'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode',
'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace',
'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info',
'warnoptions']

Пакети

panda/
    __init__.py
    head.py
    body.py
    belly.py
    eyes.py
    tail.py
    # ...

Импортване на всичко от даден модул

from panda import *

__all__

Релативни пътища

Можем да пропуснем търсенето в sys.path и директно да импортнем нещо от текущата директория

from . import panda

Можем да търсим и в "горния" възел

from .. import panda

Или:

from ..panda import tail

Инсталиране на пакети

Long story short

pip install package-name-goes-here

В живия живот

Драми

virtualenv

Изолирани обкръжения за python кода ни, в които можем да инсталираме каквото си искаме и да ползваме която си искаме версия на python

$ virtualenv ~/panda_env
$ source ~/panda_env/bin/activate
(panda_env)$ which python
/home/pandyo/panda_env/bin/python
(panda_env)$ which pip
/home/pandyo/panda_env/bin/pip
(panda_env)$ pip install dateutils

virtualenv

>>> import dateutils
>>> dateutils
<module 'dateutils' from '/home/pandyo/panda_env/lib/python3.4/site-packages/dateutils/__init__.py'>

Когато приключим можем да изпълним shell функцията deactivate или просто да излезем от shell-а

virtualenv is awesome!

Изолация, разделяне на отговорности, поддържане на адекватни версии на зависимостите, …

Когато нещо много страшно се счупи триете една папка и инсталирате само пакетите, които са нужни за един проект

virtualenv is (pretty) awesome!

Само т'ва експлицитно писане на директории и source-ване на shell скриптове е малко грозно…

virtualenvwrapper is actually incredibly awesome!

$ sudo pip install virtualenvwrapper

$ mkvirtualenv panda
$ workon panda
(panda)$ 

От къде ги тегли?

PyPI - the Python Package Index

Как да качим пакет там?

Пример

from setuptools import setup, find_packages

setup(
    name="hello_world",
    version="0.1",
    packages=find_packages(),
    install_requires=['world>=1'],
    author="Me",
    author_email="me@example.com",
    description="This is an Example Package",
    license="PSF",
    keywords="hello world example examples",
    url="http://example.com/hello_world/"
)

Classifiers

setup(...,
    classifiers=[
      'Development Status :: 4 - Beta',
      'Environment :: Console',
      'Environment :: Web Environment',
      'Intended Audience :: End Users/Desktop',
      'Intended Audience :: Developers',
      'Intended Audience :: System Administrators',
      'License :: OSI Approved :: Python Software Foundation License',
      'Operating System :: MacOS :: MacOS X',
      'Operating System :: Microsoft :: Windows',
      'Operating System :: POSIX',
      'Programming Language :: Python',
      'Topic :: Communications :: Email',
      'Topic :: Office/Business',
      'Topic :: Software Development :: Bug Tracking',
    ],
)

List trove classifiers

Добре, имаме го и сега какво?

PyPI

python setup.py register
python setup.py sdist upload

Терминология

wheel

PEP 427

Защо пък wheel?

Какво да направим за целта?

pip install wheel
python setup.py bdist_wheel

Въпроси?