Data & Tekoälykoulutusopas 2021
Lataa GoDataDrivenin esite, josta saat kattavan yleiskatsauksen saatavilla olevista koulutustilaisuuksista sekä datatekniikan, datatieteen, data-analyytikon ja analytiikkakääntäjän oppimispolusta.
Kun käytät pythonia ammattimaisesti, kannattaa projektit
asetella johdonmukaisesti. Tämä auttaa yhteistyökumppaneitasi ymmärtämään nopeasti
projektin
rakenteen ja helpottaa heitä asettamaan projektin
omalle koneelleen. Avain projektin määrittämiseen on setup.py
-tiedosto.
Tässä blogissa menen tämän tiedoston yksityiskohtiin.
Miten aloitamme
Tässä oletan, että sinulla on jo valmiiksi paketti, jonka haluat määrittää.
Tämän ei tarvitse olla valmis paketti – ideaalitapauksessa luodaansetup.py
jo kauan ennen projektin valmistumista. Se voi olla jopa tyhjä paketti;
varmista vain, että pakettikansio on olemassa
ja sisältää tiedoston nimeltä init.py
(joka voi olla tyhjä).
Jos noudatat kollegani Henkin rakennetta
projektillesi, lähtötilanteesi pitäisi näyttää jotakuinkin tältä:
example_project/├── exampleproject/ Python package with source code.│ ├── __init__.py Make the folder a package.│ └── example.py Example module.└── README.md README with info of the project.
Rakenteessasi voi olla muitakin tiedostoja tai kansioita, esimerkiksi
kansioita nimeltä notebooks/
, tests/
tai data/
, mutta niitä ei tarvita.
Juttu setup.py
Kun olet luonut tällaisen paketin, niin olet todennäköisesti
käyttänyt osaa koodista muissa paikoissa. Saatat esimerkiksi haluta
tehdä tämän muistikirjaan:
from exampleproject.example import example_function
Tämä toimisi, jos nykyinen työhakemistosi on example_project/
, mutta
kaikissa muissa tapauksissa python antaa sinulle tulosteen kuten:
ModuleNotFoundError: No module named 'exampleproject'
Voisit kertoa pythonille, mistä etsiä pakettia asettamalla PYTHONPATH
ympäristömuuttujan PYTHONPATH
tai lisäämällä polun sys.path
,
mutta se ei ole läheskään ihanteellista: se vaatisi erilaisia toimia eri
alustoilla, ja asetettava polku riippuu koodisi sijainnista.
Paljon parempi tapa on asentaa pakettisi käyttämällä setup.py
ja pip
,
koska pip
on vakiotapa asentaa kaikki muut paketit, ja sen on pakko
toimia samalla tavalla kaikilla alustoilla.
Minimaalinen esimerkki
Miltä setup.py
-tiedosto siis näyttää? Tässä on minimaalinen esimerkki0:
from setuptools import setup, find_packagessetup( name='example', version='0.1.0', packages=find_packages(include=))
Tässä määritetään kolme asiaa:
- Paketin nimi, joka on nimi, jota
pip
käyttää paketistasi.
Tämän ei tarvitse olla sama kuin kansion nimi, jossa paketti asuu
, vaikka voi olla hämmentävää, jos se ei ole. Esimerkki tilanteesta, jossa paketin
nimi ja hakemisto eivät täsmää, on Scikit-Learn: asennat sen
käyttämälläpip install scikit-learn
, kun taas käytät sitä tuomalla sensklearn
:sta. - Pakettisi versio. Tämä on versio, jonka
pip
ilmoittaa, ja sitä käytetään
esimerkiksi silloin, kun julkaiset pakettisi PyPI:ssä1. - Mitä paketteja sisällytetään; meidän tapauksessamme tämä on vain
exampleproject/
.
Tässä annammesetuptools
selvittää tämän
automaattisesti2. Vaikka voisit periaatteessa käyttääfind_packages()
ilman argumentteja, tämä voi mahdollisesti johtaa siihen, että ei-toivottuja paketteja sisällytetään
. Näin voi käydä esimerkiksi,
jos olet sisällyttänyt__init__.py
:ntests/
hakemistoon. Vaihtoehtoisesti voit myös käyttääexclude
-argumenttia, jolla voit nimenomaisesti
estää testien sisällyttämisen pakettiin, mutta tämä on hieman
epävarmempi.
Pakettisi asentamiseksi sinun tarvitsee nyt vain suorittaa seuraava
hakemiston example_project/
sisältä3:
pip install -e .
Tässä .
viittaa nykyiseen työhakemistoon, jonka oletan olevan se hakemisto
, josta setup.py
löytyy. Lippu -e
määrittää, että haluamme asentaa
muokattavassa tilassa, mikä tarkoittaa
että kun muokkaamme pakettimme tiedostoja, meidän ei tarvitse asentaa
pakettia uudelleen ennen kuin muutokset tulevat voimaan. Sinun on kuitenkin joko käynnistettävä
python uudelleen tai ladattava paketti uudelleen!
Kun muokkaat tietoja setup.py
itse setup.py
-paketissa, joudut useimmissa tapauksissa asentamaan
paketin uudelleen, ja myös jos lisäät uusia (ali)paketteja.
Kun olet epävarma, ei koskaan voi olla pahitteeksi asentaa uudelleen. Aja vain pip install -e .
uudelleen.
Vaatimukset
Useimmilla projekteilla on joitakin riippuvuuksia. Olet todennäköisesti käyttänyt
vaatimuksia.txt
-tiedostoa ennenkin, tai environment.yml
-tiedostoa, jos käytät conda
. Nyt kun luot setup.py
-tiedoston, voit määrittää
riippuvuudet install_requires
-argumentissa.
Tyypillisessä datatieteen projektissa voi esimerkiksi olla:
setup( name='example', version='0.1.0', packages=find_packages(include=), install_requires=)
Voit määrittää vaatimukset ilman versiota (PyYAML
), kiinnittää version (pandas==0.23.3
), määritellä
minimi
versiossa ('numpy>=1.14.5
) tai määritellä versioiden vaihteluväli (matplotlib>=2.2.0,<3.0.0
). Nämä
vaatimukset asennetaan automaattisesti pip
, kun asennat pakettisi.
Extras-require
Joskus sinulla voi olla riippuvuuksia, joita tarvitaan vain tietyissä tilanteissa. Tietotutkijana
teen usein paketteja, joita käytän mallin kouluttamiseen. Kun työskentelen tällaisen mallin parissa vuorovaikutteisesti
saatan tarvita matplotlib
ja jupyter
asennettuna, jotta voin työskennellä vuorovaikutteisesti
datan kanssa ja luoda visualisointeja
mallin suorituskyvystä. Toisaalta, jos malli toimii tuotannossa, en
halua asentaa matplotlib
enkä jupyter
siihen koneeseen (tai konttiin), jossa harjoittelen
tai teen päättelyä. Onneksi setuptools
mahdollistaa valinnaisten riippuvuuksien määrittämisen extras_require
:
setup( name='example', version='0.1.0', packages=find_packages(include=), install_requires=, extras_require={ 'interactive': , })
Nyt jos asennamme paketin normaalisti (pip install example
PyPI:stä tai pip install -e .
paikallisesti)
asennetaan vain riippuvuudet PyYAML
, pandas
ja numpy
. Kun kuitenkin määrittelemme
haluavamme valinnaiset interactive
-riippuvuudet (pip install example
tai pip install -e .
),
asennetaan myös matplotlib
ja jupyter
.
Skriptit ja sisäänmenopisteet
PyPI:stä asennettavien useimpien python-pakettien pääasiallinen käyttötarkoitus on tarjota toiminnallisuutta
, jota voidaan käyttää muussa python-koodissa. Toisin sanoen, voit import
käyttää näitä paketteja.
Datatutkijana teen usein paketteja, joita ei ole tarkoitus käyttää muussa python-koodissa, mutta
on tarkoitus tehdä jotain, esimerkiksi kouluttaa malli. Näin ollen minulla on usein python-skripti, jonka
haluan suorittaa komentoriviltä.
Paras tapa4 paljastaa pakettisi toiminnallisuus komentoriville on määritellä
a entry_point
seuraavasti:
setup( # ..., entry_points={ 'console_scripts': })
Nyt voit käyttää komentoriviltä komentoa my-command
, joka puolestaan suorittaa exampleproject/example.py
:n sisällä olevan main
funktion main
. Älä unohda asentaa uudelleen – muuten komento
ei rekisteröidy.
Testit
Kun kirjoitat mitä tahansa koodia, kehotan sinua painokkaasti kirjoittamaan tälle koodille myös testit. Testaamiseen
pythonilla suosittelen käyttämään pytest
. Et tietenkään halua lisätä pytest
riippuvuuksiisi
kohdassa install_requires
: pakettisi käyttäjät eivät tarvitse sitä. Jotta se asennetaan
automaattisesti testejä suorittaessasi, voit lisätä setup.py
:
setup( # ..., setup_requires=, tests_require=,)
Lisäksi sinun on luotava tiedosto nimeltä setup.cfg
, jonka sisältö on seuraava:
test=pytest
Nyt voit yksinkertaisesti suorittaa python setup.py test
ja setuptools
varmistaa, että tarvittavat riippuvuudet
on asennettu ja suorittaa pytest
puolestasi! Katso täältä, jos
haluat antaa argumentteja tai asettaa konfiguraatioasetuksia pytest
:lle.
Jos sinulla on lisävaatimuksia testausta varten (esim. pytest-flask
), voit lisätä ne kohtaan tests_require
.
Flake8
Henkilökohtaisesti olen sitä mieltä, että Flake8:n ajaminen on hyvä ajatus, jotta voit
tehdä tarkistuksen ohjelmakoodisi muotoilusta. Aivan kuten pytest
:n kohdalla, et halua lisätä flake8
:täinstall_requires
-riippuvuuksiin: sitä ei tarvitse asentaa, jotta voit käyttää
pakkaustasi. Sen sijaan voit lisätä sen setup_requires
:
setup( # ..., setup_requires=)
Nyt voit yksinkertaisesti suorittaa python setup.py flake8
. Voit tietysti myös kiinnittää flake8
:n (tai minkä tahansa muun paketin) version
kohtaan setup_requires
.
Jos haluat muuttaa joitain Flake8:n konfiguraatioparametreja, voit lisätä -osion
kohtaan setup.cfg
. Esimerkiksi:
max-line-length=120
Paketin tiedot
Joskus saatat haluta sisällyttää pakettiisi joitakin muita kuin python-tiedostoja. Nämä
voivat olla esimerkiksi skeematiedostoja tai pieni hakutaulukko. Huomaa, että tällaiset tiedostot
paketoidaan yhdessä koodisi kanssa, joten on yleisesti ottaen huono idea sisällyttää
mitä tahansa suuria tiedostoja.
Esitettäkö, että meillä on schema.json
projektissamme schema.json
, jonka sijoitamme exampleproject/data/schema.json
.
Jos haluamme sisällyttää sen pakettiimme, meidän on käytettävä package_data
-argumenttia setup
:
setup( # ..., package_data={'exampleproject': })
Tämä varmistaa, että tiedosto sisällytetään pakettiin. Voimme myös valita sisällyttää
kaikki tiedostot jonkin mallin perusteella, esimerkiksi:
setup( # ..., package_data={'': })
Tämä lisää kaikki *.json
-tiedostot kaikkiin kohtaamiinsa paketteihin.
Älä nyt yritä itse selvittää asennettujen tiedostojen sijaintia, silläpkg_resources
:ssä on joitakin erittäin käteviä käteviä toimintoja:
-
pkg_resources.resource_stream
antaa sinulle tiedoston virran, aivan kuten
objekti, jonka saat, kun kutsutopen()
, -
pkg_resources.resource_string
antaa sinulle tiedoston sisällön merkkijonona, -
pkg_resources.resource_filename
antaa sinulle tiedoston nimen (ja purkaa
se väliaikaiseksi, jos se sisältyy pakattuun pakettiin), jos kaksi edellä mainittua vaihtoehtoa
eivät vastaa tarpeitasi.
Voisimme esimerkiksi lukea skeemamme sisään käyttämällä:
from json import loadfrom pkg_resources import resource_streamschema = load(resource_stream('exampleproject', 'data/schema.json'))
Metadata
Jos aiot julkaista pakettisi, haluat luultavasti antaa
potentiaalisille käyttäjillesi lisätietoa paketistasi, mukaan lukien kuvauksen,
tekijän tai ylläpitäjän nimen ja url-osoitteen paketin kotisivulle.
Luettelon kaikista sallituista metatiedoista löydät setuptools
dokumenteista.
Lisäksi, jos aiot julkaista PyPI:ssä, voit halutessasi
automaattisesti ladata README.md
sisällön long_description
,
ja tarjota luokittelijoita, jotka kertovat pip
vielä
enemmän paketistasi.
Pakkaus
Tämän blogin pitäisi olla hyvä lähtökohta useimpien python-projekteidesi asentamiseen.
Jos haluat lukea lisää python-paketoinnista, vilkaise
dokumentteja. Tässä on esimerkki setup.py
jossa yhdistyvät kaikki tässä blogissa esitetyt osat:
from setuptools import setup, find_packagessetup( name='example', version='0.1.0', description='Setting up a python package', author='Rogier van der Geer', author_email='[email protected]', url='https://blog.godatadriven.com/setup-py', packages=find_packages(include=), install_requires=, extras_require={'plotting': }, setup_requires=, tests_require=, entry_points={ 'console_scripts': }, package_data={'exampleproject': })
ja oheinen setup.cfg
:
test=pytestmax-line-length=120
Paranna Python-taitojasi, opi asiantuntijoilta!
GoDataDrivenillä tarjoamme lukuisia Python-kursseja aloittelijasta asiantuntijaan, ja niitä opettavat alan parhaimmat asiantuntijat. Liity meihin ja nosta Python-pelisi tasoa:
- Python Essentials – Sopii loistavasti, jos vasta aloitat Pythonilla.
- Certified Data Science with Python Foundation – Haluatko ottaa askeleen ylöspäin data-analyysistä ja visualisoinnista todelliseen datatieteeseen? Tämä on oikea kurssi.
- Advanced Data Science with Python – Opi tuottamaan mallejasi ammattilaisen tavoin ja käyttämään Pythonia koneoppimiseen.
Footnotes
0: Tässä blogissa olen käyttänyt setuptools
esimerkkiprojektin perustamiseen. Vaihtoehtoisesti
voisit myös käyttää distutilsia,
joka on pythonin vakiotyökalu pakkaamiseen, mutta siitä puuttuu ominaisuuksia
kuten find_packages()
-funktio ja entry_points
.
Koska setuptoolsin käyttö on nykyään hyvin yleistä ja monet sen ominaisuuksista
voivat olla erityisen hyödyllisiä, suosittelen käyttämään setuptoolsia.
1: Jos haluat, että pakettisi versio
on saatavilla myös pythonin sisällä,
katso täältä.
2: Voit myös listata pakettisi manuaalisesti, mutta tämä on erityisen virhealtista.
3: Vaihtoehtoisesti voit käyttää python setup.py install
, mutta pip
:n käyttämisellä on
paljon etuja, muun muassa riippuvuuksien automaattinen asennus ja
mahdollisuus poistaa tai päivittää pakettisi.
4: Voisit myös käyttää scripts
-argumenttia (katso
esimerkki täältä)
mutta koska tämä edellyttää python-shell-skriptin luomista, se ei ehkä toimi
yhtä hyvin (tai ei ollenkaan) Windowsissa.
Mitä?