Lumaktaw sa pangunahing nilalaman

Alamin ang mga breaking na pagbabago sa Qiskit v1.0 package

Gumagamit ang Qiskit v1.0 ng ibang istraktura ng packaging kaysa sa mga nakaraang bersyon ng Qiskit, at malamang na magdulot ito ng mga problema sa mga environment na gumagamit ng mga package na hindi pa handa para sa Qiskit v1.0.

babala

Huwag subukang i-upgrade ang isang kasalukuyang Python virtual environment sa Qiskit v1.0 nang direkta (in-place).

Hindi na kami gagawa ng mga katulad na breaking na pagbabago sa packaging sa hinaharap. Isang beses lang itong mangyayari, sa paglulunsad ng Qiskit v1.0, partikular na para maging mas simple ang aming packaging sa hinaharap.

Naglalaman ang pahinang ito ng detalyadong impormasyon tungkol sa pre-1.0 na Qiskit package at kung bakit namin ginawa ang mga breaking na pagbabago sa packaging.

Alam namin na nakakaabala ang pagbabago, ngunit ibinabalik nito ang Qiskit sa simpleng istraktura ng package na ginagamit ng karamihan sa mga Python package, na magiging mas madali para sa mga gumagamit, developer, at may-akda ng library pagkatapos makumpleto ang transisyon sa Qiskit v1.0.

Paunang salita: talasalitaan ng Python packaging terminology​

Para mas maipaliwanag kung paano nakaayos ang lumang Qiskit metapackage at kung paano ito nagbago sa paglulunsad ng Qiskit v1.0, narito ang isang talasalitaan ng mga karaniwang terminolohiya sa Python packaging. Ang mga sumusunod na salita ay may mga tiyak na kahulugan na gagamitin namin sa dokumentong ito.

I-click dito para basahin ang talasalitaan ng pahinang ito
  • module: Isang Python file.

  • package: Isang directory na naglalaman ng __init__.py at iba pang mga file o package na mababasa ng Python. Ito ang aktwal na code na naka-install sa iyong computer, at ito ang nagpapatakbo kapag nag-run ka ng import something. Itinuturing ng Python na maaari mong i-import ang anumang directory na nasa search path (at mag-iimport pa ng maraming karagdagang aytem).

    Hindi ito ang parehong object na pip install mo (na isang distribution), ngunit karaniwan, ang pip install mo at ang import mo ay may parehong pangalan.

  • submodule, subpackage: Mga hindi tiyak na termino, ngunit karaniwang ginagamit. Ang bahaging sub ay nangangahulugang "nakapaloob sa isang package". Ang submodule ay isang module at ang subpackage ay isang package, ngunit bahagi sila ng isang mas malaking package.

  • namespace package: Isang package na maaaring magkaroon ng mga submodule o subpackage na naka-install dito mula sa iba pang mga distribution. Mahalaga, walang isang distribution na nag-aambag sa isang namespace package ang kinakailangan may-ari ng lahat ng naka-install na file, kaya maaaring maging mahirap ang ganap na pag-uninstall o pag-upgrade nito.

  • distribution: Ang mga compressed na Python file, data file, at metadata na dina-download kapag nag-run ka ng pip install something. Kadalasan, ang isang distribution ay naglalaman ng eksakto isang package at ang metadata tungkol sa kung paano ito i-install (ang mga kinakailangan nito at iba pa), ngunit hindi ito kinakailangan. Ang isang distribution ay maaaring maglaman ng zero o higit pang mga module o package.

    Kung pamilyar ka sa mga "package manager" sa labas ng konteksto ng Python, tulad ng apt mula sa Debian/Ubuntu o Homebrew sa macOS, kung gayon ang tinatawag nilang "package" ay tinatawag ng Python na distribution, at walang eksaktong katumbas para sa tinatawag ng Python na package.

    Karamihan sa mga pinagkukunan na nagsasalita tungkol sa Python packaging ay gumagamit ng terminong package para mangahulugang parehong distribution at package, at kailangan mong sumangguni sa konteksto para maunawaan ang ibig sabihin. Sa pangkalahatan, kung import mo ito, ang ibig sabihin ng pinagkukunan ay "package", at kung pip install mo ito, ang ibig sabihin ng pinagkukunan ay "distribution".

  • search path: Kapag sinusubukang import something, naghahanap ang Python sa isang paunang natukoy na listahan ng mga lugar para sa isang module o package na tinatawag na something. Ang listahan ng mga lugar ay ang search path. Makikita at mababago mo ang search path sa sys.path.

  • requirement: Ang isang distribution ay naglalaman ng impormasyon tungkol sa iba pang mga distribution na umaasa ito kapag naka-install. Ang anumang iba pang distribution na kinakailangan ay isang requirement, at ang package manager (karaniwan ay pip o conda) ay dapat tiyaking naka-install ang lahat ng requirement na may mga compatible na bersyon.

Napaka-dynamic ng Python, at maraming kumplikadong bagay ang maaaring lumabas; halimbawa, posible na ang isang module o package ay hindi tumutugma sa mga file sa disk, o na mga compiled na extension ang mga ito.

Ang search path ay hindi lamang isang paghahanap sa mga directory, ngunit para sa talakayan na ito, ang mga file lamang sa disk ang may kaugnayan. Hindi na kailangan ng karagdagang kumplikadong bagay para maunawaan ang mga problemang inilarawan sa seksyong ito, kaya maaari mong gamitin ang modelong inilarawan sa itaas.

Ang lumang istraktura ng Qiskit​

Mahistoriko, ang Qiskit ay binubuo ng maraming Python distribution: qiskit-terra, ang compiler core; qiskit-aer, ang high-performance simulator; ang orihinal na IBM Quantum® provider; at ilang ngayon ay-obsolete na mga package na nagbibigay ng mga partikular na exploratory algorithmic o experiment-running na feature. Para sa kaginhawahan ng gumagamit, nagbigay din kami ng Python distribution na tinatawag na qiskit, na walang sariling code, ngunit nag-install ng lahat ng iba pang component. Tinawag namin ito na metapackage, sa pamamagitan ng pagkakatulad sa mga katulad na konsepto sa iba pang mga package manager. Ang code ng core ng Qiskit ay nasa qiskit-terra, na nagmamay-ari ng root ng Python package na qiskit. Sa madaling salita, kontrolado ng qiskit-terra ang nangyayari kapag nag-run ka ng import qiskit. Hanggang Qiskit v1.0, ang qiskit package ay isang namespace package at naglalaman ng pangalawang namespace package sa qiskit.providers.

Ang organisasyong ito ay nagdulot sa amin at sa aming mga gumagamit ng ilang mga problema.

Halimbawa, ang mga downstream library na umasa sa Qiskit ay kadalasan lang talaga kailangan ang compiler core, at hindi nangangailangan ng buong malaking ecosystem na kasama ng pip install qiskit. Kaya tama nilang tinukoy ang kanilang requirement bilang qiskit-terra. Ngunit, kapag sinubukan ng mga tao na i-uninstall ang Qiskit sa pamamagitan ng pagpapatakbo ng pip uninstall qiskit, nakatagpo ng mga problema ang pip:

  • Hindi inaalis ng pip ang mga distribution na hindi na ginagamit. Kaya ang pip uninstall qiskit ay halos walang ginawa; walang code sa distribution, kaya walang code na naalis.
  • Kahit na aalisin nito ang code, maraming downstream distribution ang mananatiling naka-install dahil umaasa sila sa qiskit-terra.
  • Kahit na na-uninstall ang qiskit-terra, maaari pa ring mag-iwan ito ng importable na qiskit directory na walang magamit na code, dahil ito ay isang namespace package.

Kapag nag-install o nag-upgrade ng mga distribution gamit ang isang pip install command, hindi rin isinasaalang-alang ng pip ang mga nakaraang resolution ng requirement. Dahil may dalawang package, ang pag-upgrade ng isang package na nangangailangan ng pag-upgrade ng qiskit-terra ay nagdulot ng invalid na environment; na-upgrade ng pip ang qiskit-terra ngunit hindi nito hinawakan ang qiskit. Nagbigay ito ng babala sa nito at sa lahat ng kasunod na pip install command, ngunit dahil walang tila nabasag, karaniwan ay hindi pinansin ng mga gumagamit ang babala, at hindi nagtaas ng error status o nagbawal ng mga operasyon ang pip.

Sa paglipas ng panahon, inalis namin ang mga elemento mula sa qiskit metapackage hanggang, simula sa Qiskit v0.44, qiskit-terra na lang ang natitira. Sa mga component na ito, ang qiskit-aer ay umiiral pa rin at aktibong ina-update, ngunit ito ngayon ay naka-install bilang isang hiwalay na distribution.

Gayundin, lalo na naming hinimok ang iba pang mga library na huwag gumamit ng namespace hooks. Inalis namin ang huling paggamit ng Qiskit ng mga hook sa mga hindi-obsolete na package sa paglulunsad ng Qiskit Aer v0.11 at ang bagong qiskit_aer Python package nito, kahit hanggang Qiskit v1.0 ay pinilit pa rin naming gumana ang namespace path na qiskit.providers.aer. Simula sa Qiskit v1.0, inalis na namin ang kakayahan ng mga package na palawakin ang anumang qiskit namespace. Kaya, ang pip uninstall sa tamang distribution sa isang valid na environment ngayon ay gumagana na tulad ng inaasahan.

Ang bagong istraktura ng Qiskit​

Simula sa bersyon 1.0, ang Qiskit ay binubuo ng isang distribution, na tinatawag na qiskit, na nag-iinstall ng isang package, na tinatawag din na qiskit, na nagmamay-ari ng lahat ng code na nakapaloob sa directory nito. Ito ang normal na istraktura ng Python code, at ito ang pinakasimple at pinaka-hindi-nagkakamaling istraktura.

Ang qiskit-terra distribution sa PyPI ay hindi na ia-update sa bersyon 1.0 o higit pa; ganap itong pinalitan ng qiskit. Ang pangalang qiskit-terra ay hindi na kasangkot sa pag-install. Ngunit, ang qiskit-terra package ay hindi inaalis mula sa PyPI, at iiwanan namin ang pinakabagong bersyon nito sa isang gumaganang estado, para mas madaling magpatuloy na gamitin ang lumang scientific code at legacy package.

Sa kasamaang-palad, dahil sa legacy ng metapackage at mga kakulangan sa pip bilang isang package manager, hindi posible para sa amin na gumawa ng ganap na maayos na upgrade path para sa mga gumagamit patungo sa Qiskit v1.0, lalo na habang ang ilang mga package ay umaasa sa mga mas lumang bersyon ng Qiskit, at ang ilan ay nangangailangan ng Qiskit v1.0+ lamang. Ang mga problemang ito ay mababawasan habang mas maraming ecosystem ang nag-migrate sa Qiskit v1.0.

Nasaan na ang mga application module?​

Maaari mong mapansin na ang command na pip install qiskit ay hindi na nagsasama ng mga package tulad ng qiskit-aer o qiskit-nature. Sa pag-alis ng metapackage structure, marami sa mga package na ito ay nahahati sa mga distribution na kailangang i-install nang hiwalay.

Bago ang paglulunsad ng Qiskit SDK v1.0, ang Qiskit ay binubuo ng maraming iba't ibang Python distribution, tulad ng qiskit-terra, ang compiler core; qiskit-aer, ang high-performance simulator; ang orihinal na IBM Quantum® provider; at ilang ngayon ay-obsolete na mga package na nagbibigay ng mga partikular na exploratory algorithmic o experiment-running na feature.

Kung gusto mong i-install ang mga package na dating kasama sa Qiskit metapackage, bisitahin ang Qiskit ecosystem para mahanap ang iba't ibang mga package na angkop sa iyong mga pangangailangan. Maaari ka ring basahin ang v1.0 migration guide para sa karagdagang impormasyon tungkol sa kung paano i-install ang bagong distribution.