הבנת שינויי החבילות השוברים
Qiskit v1.0 משתמש במבנה אריזה שונה מגרסאות Qiskit קודמות, וסביר להניח שהוא יגרום לבעיות בסביבות שמשתמשות בחבילות שאינן מוכנות ל-Qiskit v1.0.
אל תנסה לשדרג סביבה וירטואלית קיימת של Python ל-Qiskit v1.0 במקום (in-place).
לא נבצע שינויי אריזה שוברים דומים בעתיד. זהו אירוע חד-פעמי, עם שחרור Qiskit v1.0, ספציפית כדי שתהליך האריזה שלנו יהיה פשוט ככל האפשר בעתיד.
דף זה מכיל מידע מפורט על חבילת Qiskit שלפני גרסה 1.0 ומדוע ביצענו את שינויי האריזה השוברים.
אנחנו יודעים שהשינוי אינו נוח, אך זה משיב את Qiskit למבנה החבילה הפשוט שרוב חבילות Python משתמשות בו, מה שיהיה קל יותר למשתמשים, מפתחים ומחברי ספריות לאחר השלמת מעבר Qiskit v1.0.
מבוא: מילון מונחים של אריזת Python
כדי להסביר טוב יותר כיצד ה-metapackage הישן של Qiskit היה מובנה וכיצד זה השתנה עם שחרור Qiskit v1.0, להלן מילון מונחים של ז'רגון אריזת Python נפוץ. למילים הבאות יש משמעויות ספציפיות שנשתמש בהן במסמך זה.
לחץ להרחבה כדי לקרוא את מילון המונחים של דף זה
-
module (מודול): קובץ Python בודד.
-
package (חבילה): ספרייה המכילה
__init__.pyוקבצים נוספים או חבילות שPython יכול לקרוא. זהו הקוד בפועל כפי שמותקן במחשב שלך, והוא מה שמתבצע כאשר אתה מריץimport something. Python מתייחס לכל ספרייה שנמצאת בנתיב החיפוש כדבר שאתה יכול לייבא (ויייבא פריטים נוספים רבים).זהו לא אותו אובייקט שמתקינים באמצעות
pip install(שהוא distribution), אך בדרך כלל מה שמתקינים ב-pip installומה שמייבאים ב-importנושאים את אותו השם. -
submodule, subpackage (תת-מודול, תת-חבילה): אלו מונחים לא מדויקים, אך נפוצים בשימוש. החלק sub פירושו "כלול בתוך חבילה". submodule הוא module ו-subpackage הוא package, אך הם חלק מחבילה גדולה יותר.
-
namespace package (חבילת מרחב שמות): חבילה שיכולה להכיל submodules או subpackages המותקנים לתוכה על ידי distributions אחרות. באופן קריטי, אף distribution שתורמת לחבילת מרחב שמות אינה בהכרח הבעלים של כל הקבצים המותקנים, ולכן עלול להיות מסובך להסיר אותה לחלוטין או לשדרגה.
-
distribution (הפצה): קבצי Python דחוסים, קבצי נתונים ומטא-נתונים שמורדים כאשר אתה מריץ
pip install something. לעיתים קרובות, distribution מכילה בדיוק חבילה אחת ומטא-נתונים על אופן התקנתה (הדרישות שלה וכן הלאה), אך זה אינו חובה. distribution יכולה להכיל אפס מודולים או חבילות או יותר.אם אתה מכיר "מנהלי חבילות" מחוץ להקשר של Python, כגון
aptמ-Debian/Ubuntu או Homebrew ב-macOS, אז מה שהם מכנים "package", Python מכנה distribution, ואין התאמה מדויקת למה שPython מכנה package.רוב המקורות העוסקים באריזת Python משתמשים במונח package כדי לציין גם distributions וגם packages, ועליך להתייחס להקשר כדי להבין את הכוונה. באופן כללי, אם מייבאים אותו (
import), המקור מתכוון ל-"package", ואם מתקינים אותו באמצעותpip install, המקור מתכוון ל-"distribution". -
search path (נתיב חיפוש): כאשר מנסים לבצע
import something, Python מחפש ברשימה מוגדרת מראש של מקומות עבור module או package בשםsomething. רשימת המקומות היא search path. אתה יכול לראות ולשנות את נתיב החיפוש ב-sys.path. -
requirement (תלות): distribution מכילה מידע על distributions אחרות שהיא תלויה בהן בעת ההתקנה. כל distribution אחרת הנדרשת היא requirement, ומנהל החבילות (בדרך כלל
pipאוconda) אמור להבטיח שכל הדרישות מותקנות בגרסאות תואמות.
Python הוא דינמי ביותר, ועלולות להתעורר מורכבויות רבות; לדוגמה, ייתכן ש-module או package אינם מתאימים לקבצים בדיסק, או שהם הרחבות מקומפלות.
נתיב החיפוש אינו רק חיפוש על פני ספריות, אך לצורך דיון זה, רלוונטיים רק קבצים בדיסק. סיבוכים נוספים אינם נחוצים להבנת הבעיות המתוארות בחלק זה, כך שאתה יכול להשתמש במודל המתואר לעיל.
מבנה Qiskit הישן
היסטורית, Qiskit היה מורכב מהפצות Python רבות: qiskit-terra, ליבת המהדר; qiskit-aer, הסימולטור בעל הביצועים הגבוהים; ספק IBM Quantum® המקורי; ומספר חבילות שכיום כבר מיושנות, שסיפקו יכולות אלגוריתמיות חקרניות ספציפיות או יכולות להרצת ניסויים.
לנוחות המשתמש, סיפקנו גם הפצת Python בשם qiskit, שלא הכילה קוד משלה, אך גרמה להתקנת כל הרכיבים האחרים.
כינינו זאת ה-metapackage, בהשוואה למושגים דומים במנהלי חבילות אחרים.
קוד הליבה של Qiskit ישב ב-qiskit-terra, שהיה הבעלים של שורש החבילה qiskit ב-Python. במילים אחרות, qiskit-terra שלט במה שקרה כאשר הרצת import qiskit.
עד Qiskit v1.0, החבילה qiskit הייתה חבילת מרחב שמות והכילה חבילת מרחב שמות שנייה ב-qiskit.providers.
ארגון זה גרם לנו ולמשתמשים שלנו לא מעט בעיות.
לדוגמה, ספריות במורד הזרם שהיו תלויות ב-Qiskit לעיתים קרובות היו צריכות רק את ליבת המהדר בפועל, ולא דרשו את שאר המערכת הגדולה שהגיעה עם pip install qiskit.
לכן, הן היו מציינות נכונה את הדרישה שלהן כ-qiskit-terra.
עם זאת, כאשר אנשים ניסו להסיר את Qiskit על ידי הרצת pip uninstall qiskit, pip נתקל בבעיות:
-
pipאינו מסיר distributions שכעת אינן בשימוש. לכןpip uninstall qiskitכמעט לא עשה דבר; לא היה קוד ב-distribution, ולכן לא הוסר קוד. -
גם אם היה מסיר קוד, הפצות רבות במורד הזרם היו נשארות מותקנות מכיוון שהן תלויות ב-
qiskit-terra. -
גם אם
qiskit-terraהיה מוסר, עלול להישאר ספרייתqiskitשניתן לייבאה ללא קוד שמיש, מכיוון שהיא הייתה חבילת מרחב שמות.
בעת התקנה או שדרוג הפצות עם פקודת pip install, pip גם אינו לוקח בחשבון החלטות קודמות לגבי פתרון התלויות.
מכיוון שהיו שתי חבילות, שדרוג חבילה שדרשה שדרוג qiskit-terra גרם לסביבה לא תקינה; pip שדרג את qiskit-terra אך השאיר את qiskit ללא שינוי.
הוא הנפיק אזהרה על כך ועל כל פקודות pip install עתידיות, אך מאחר ששום דבר לא נראה שבור, משתמשים בדרך כלל התעלמו מהאזהרה, ו-pip לא החזיר קוד שגיאה ולא חסם פעולות.
עם הזמן, הסרנו רכיבים מה-qiskit metapackage עד שמ-Qiskit v0.44 ואילך, נשאר רק qiskit-terra.
מבין הרכיבים הללו, qiskit-aer עדיין קיים ומתעדכן באופן פעיל, אך הוא מותקן כעת כהפצה נפרדת.
באופן דומה, המלצנו בתוקף הולך וגובר לספריות אחרות שלא להשתמש ב-hooks של מרחב השמות.
הסרנו את השימוש האחרון של Qiskit ב-hooks בחבילות שאינן מיושנות עם שחרור Qiskit Aer v0.11 וחבילת Python החדשה שלו qiskit_aer, אם כי עד Qiskit v1.0 אילצנו גם את נתיב מרחב השמות qiskit.providers.aer לעבוד.
החל מ-Qiskit v1.0, ביטלנו את האפשרות של חבילות להרחיב מרחב שמות כלשהו של qiskit. לפיכך, pip uninstall על ההפצה הנכונה בסביבה תקינה עובד כעת כמצופה.
מבנה Qiskit החדש
החל מגרסה 1.0, Qiskit כולל הפצה יחידה, בשם qiskit, שמתקינה חבילה אחת בלבד, גם כן בשם qiskit, שהיא הבעלים של כל הקוד הכלול בספרייה שלה.
זהו המבנה הרגיל של קוד Python, והוא המבנה הפשוט ביותר ובעל הסיכוי הנמוך ביותר לשגיאות.
הפצת qiskit-terra ב-PyPI לעולם לא תעודכן לגרסה 1.0 ומעלה; היא הוחלפה לחלוטין על ידי qiskit.
השם qiskit-terra אינו מעורב עוד בהתקנה.
עם זאת, החבילה qiskit-terra אינה מוסרת מ-PyPI, ונשאיר את הגרסה האחרונה שלה במצב עובד, כדי שקוד מדעי ישן וחבילות ישנות יוכלו להמשיך להשתמש בה ביתר קלות.
למרבה הצער, בגלל מורשת ה-metapackage וליקויים ב-pip כמנהל חבילות, אין באפשרותנו לספק נתיב שדרוג חלק לחלוטין למשתמשים ל-Qiskit v1.0, במיוחד כאשר חלק מהחבילות תלויות בגרסאות קודמות של Qiskit, וחלק דורשות רק Qiskit v1.0+.
בעיות אלו יפחתו ככל שיותר מהמערכת האקולוגית תעבור ל-Qiskit v1.0.
לאן הלכו מודולי האפליקציה?
ייתכן שתשים לב שהפקודה pip install qiskit כבר לא כוללת חבילות כגון qiskit-aer או qiskit-nature. עם הסרת מבנה ה-metapackage, רבות מהחבילות הללו פוצלו להפצות שצריך להתקין בנפרד.
לפני שחרור Qiskit SDK v1.0, Qiskit היה מורכב מהפצות Python שונות רבות, כגון qiskit-terra, ליבת המהדר; qiskit-aer, הסימולטור בעל הביצועים הגבוהים; ספק IBM Quantum® המקורי; ומספר חבילות שכיום כבר מיושנות, שסיפקו יכולות אלגוריתמיות חקרניות ספציפיות או יכולות להרצת ניסויים.
אם ברצונך להתקין את החבילות שנכללו בעבר ב-Qiskit metapackage, כנס ל-Qiskit ecosystem כדי למצוא מגוון חבילות שמתאימות לצרכיך. תוכל גם לקרוא את מדריך ההגירה של v1.0 למידע נוסף על אופן התקנת ההפצה החדשה.