כיצד לבצע פקודות מעטפת בפייתון באמצעות שיטת הפעלת תהליכי המשנה

How Execute Shell Commands Python Using Subprocess Run Method



תת-תהליך הוא מודול Python מובנה שניתן להשתמש בו ליצירת תהליכים חדשים ואינטראקציה עם זרמי הנתונים של הקלט והפלט שלהם. במונחים פשוטים יותר, אתה יכול להשתמש בו להפעלת פקודות מעטפת ולהפעלת קבצים בינאריים להפעלה המפוזרים בדרך כלל בתיקיות סל שונות במערכת קבצי לינוקס. תוכל גם לספק נתיב מלא לבנארי הפעלה ולהשתמש בכל בוררי שורת הפקודה המשויכים לבינארי. מאמר זה יסביר כיצד להשתמש במודול תהליכי המשנה ובשיטת ההפעלה שלו באפליקציות פייתון. כל דוגמאות הקוד במאמר נבדקות עם Python 3.8.2 באובונטו 20.04.

שיטת Subprocess.run

שיטת Subprocess.run לוקחת רשימה של ארגומנטים. כאשר השיטה נקראת, היא מבצעת את הפקודה ומחכה לסיום התהליך, ומחזירה בסופו של דבר אובייקט CompletedProcess. האובייקט CompletedProcess מחזיר stdout, stderr, ארגומנטים מקוריים המשמשים בעת קריאת השיטה וקוד החזרה. Stdout מתייחס לזרם הנתונים המיוצר על ידי הפקודה, בעוד stderr מתייחס לכל שגיאה שהועלתה במהלך ביצוע התוכנית. כל קוד החזרה שאינו אפס (קוד יציאה) פירושו שגיאה בפקודה המבוצעת בשיטת subprocess.run.







דוגמה 1: תוכן פלט של קובץ טקסט בשיטת Subprocess.run

הפקודה שלהלן תפיק את התוכן של קובץ data.txt, בהנחה שהוא מכיל מחרוזת name = John.



יְבוּא תת -תהליך
תת -תהליך.לָרוּץ(['חתול', 'data.txt'])

הפעלת הקוד למעלה תחזיר את הפלט הבא:



שֵׁם=ג'ון
תהליך הושלם(טוען=['חתול', 'data.txt'],קוד החזרה=0)

המרכיב הראשון של ארגומנט הרשימה הוא שם הפקודה שיש לבצע. כל רכיב ברשימה העוקב אחר האלמנט הראשון נחשב לאפשרויות שורות פקודות או מתגים. תוכל גם להשתמש במקף יחיד ובמקפים כפולים, כדי להגדיר את האפשרויות. לדוגמה, כדי להציג קבצים ותיקיות בספרייה, הקוד יהיה subprocess.run ([ls, -l]. ברוב המקרים הללו, תוכל לשקול כל ארגומנט המופרד ברווח בפקודת מעטפת כאלמנט בודד ב- הרשימה המסופקת לשיטת subprocess.run.





דוגמה 2: דיכוי פלט של שיטת Subprocess.run

כדי לדכא את הפלט של שיטת subprocess.run, יהיה עליך לספק stdout = subprocess.DEVNULL ו- stderr = subprocess.DEVNULL כארגומנטים נוספים.

יְבוּא תת -תהליך

תת -תהליך.לָרוּץ(['חתול', 'data.txt'],stdout=תת -תהליך.DEVNULL,
stderr=תת -תהליך.DEVNULL)

הפעלת הקוד למעלה תפיק את הפלט הבא:



CompletedProcess (args = ['cat', 'data.txt'], returncode = 0)

דוגמה 3: לכידת פלט של שיטת Subprocess.run

כדי ללכוד את הפלט של שיטת subprocess.run, השתמש בארגומנט נוסף בשם capture_output = True.

יְבוּא תת -תהליך
תְפוּקָה= תת -תהליך.לָרוּץ(['חתול', 'data.txt'],פלט_לכוד=נָכוֹן)
הדפס (תְפוּקָה)

הפעלת הקוד למעלה תפיק את הפלט הבא:

תהליך הושלם(טוען=['חתול', 'data.txt'],קוד החזרה=0,
stdout=ב'שם = ג'ון n',stderr=ב'')

תוכל לגשת בנפרד לערכי stdout ו- stderr באמצעות שיטות output.stdout ו- output.stderr. הפלט מיוצר כרצף בתים. כדי לקבל מחרוזת כפלט, השתמש בשיטת output.stdout.decode (utf-8). תוכל גם לספק טקסט = True כארגומנט נוסף לשיחת subprocess.run כדי לקבל את הפלט בפורמט מחרוזת. כדי לקבל קוד סטטוס יציאה, תוכל להשתמש בשיטת output.returncode.

דוגמה 4: הגדל חריג על אי שליטה בפקודה המבוצעת בשיטת Subprocess.run

כדי להעלות חריג כאשר הפקודה יוצאת עם סטטוס שאינו אפס, השתמש בטיעון check = True.

יְבוּא תת -תהליך
תת -תהליך.לָרוּץ(['חתול', 'data.tx'],פלט_לכוד=נָכוֹן,טֶקסט=נָכוֹן,חשבון=נָכוֹן)

הפעלת הקוד למעלה תפיק את הפלט הבא:

להעלות CalledProcessError (קוד מחדש, process.args,
subprocess.CalledProcessError: פקודה '[' 'cat', 'data.tx'] '
החזיר סטטוס יציאה שאינו אפס 1.

דוגמה 5: העברת מחרוזת לפקודה המבוצעת בשיטת Subprocess.run

אתה יכול להעביר מחרוזת לפקודה לביצוע בשיטת subprocess.run באמצעות ארגומנט input = 'string'.

יְבוּא תת -תהליך
תְפוּקָה= תת -תהליך.לָרוּץ(['חתול'], קֶלֶט='data.txt',פלט_לכוד=נָכוֹן,
טֶקסט=נָכוֹן,חשבון=נָכוֹן)
הדפס (תְפוּקָה)

הפעלת הקוד למעלה תפיק את הפלט הבא:

CompletedProcess (args = ['cat'], returncode = 0, stdout = 'data.txt', stderr = '')

כפי שאתה יכול לראות, הקוד למעלה מעביר data.txt כמחרוזת ולא כאובייקט קובץ. כדי להעביר data.txt כקובץ, השתמש בארגומנט stdin.

עם לִפְתוֹחַ('data.txt') כפי שו:
תְפוּקָה= תת -תהליך.לָרוּץ(['חתול'],stdin=ו,פלט_לכוד=נָכוֹן,
טֶקסט=נָכוֹן,חשבון=נָכוֹן)
הדפס (תְפוּקָה)

הפעלת הקוד למעלה תפיק את הפלט הבא:

CompletedProcess (args = ['cat'], returncode = 0, stdout = 'name = John n', stderr = '')

דוגמה 6: בצע את הפקודה ישירות במעטפת באמצעות שיטת Subprocess.run

אפשר להריץ פקודה ישירות לתוך המעטפת כפי שהיא, במקום להשתמש בפיצול מחרוזת בפקודה הראשית ובאפשרויות הבאות. לשם כך, עליך להעביר shell = True כטיעון נוסף. עם זאת, זה מיואש על ידי מפתחי פייתון כי השימוש ב- shell = True יכול להוביל לבעיות אבטחה. תוכל לקרוא עוד על השלכות אבטחה מ פה .

יְבוּא תת -תהליך
תת -תהליך.לָרוּץ('חתול' data.txt ',צדף=נָכוֹן)

הפעלת הקוד למעלה תפיק את הפלט הבא:

שם = ג'ון

סיכום

שיטת subprocess.run ב- Python היא די חזקה, מכיוון שהיא מאפשרת לך להריץ פקודות מעטפת בתוך פייתון עצמו. זה עוזר בהגבלת כל הקוד לפייתון עצמו ללא צורך בקוד סקריפט פגז נוסף בקבצים נפרדים. עם זאת, זה יכול להיות די מסובך לסמן נכון פקודות מעטפת ברשימת פייתונים. אתה יכול להשתמש בשיטת shlex.split () כדי לסמן פקודות מעטפת פשוטות, אך בפקודות ארוכות ומורכבות - במיוחד אלה עם סמלי צינור - שלקס לא מצליח לפצל את הפקודה בצורה נכונה. במקרים כאלה, איתור באגים יכול להיות בעיה מסובכת. אתה יכול להשתמש בטיעון shell = True כדי להימנע מכך, אך ישנן כמה בעיות אבטחה הקשורות לפעולה זו.