-
שלום
אני רוצה להפעיל סקריפט פייתון מNODEJS. מה הדרך היעילה לעשות את זה?
יצויין שהפרוייקט זקוק לVENV.
בתור התחלה פחות הכנתי שרשור של פקודות שורת פקודה שנכנסות לתיקיה הנכונה, מפעילים את הVENV ואז מפעילים את הסקריפט, והפעלתי אותם באמצעות child_process.exec. אבל אני חושש שזה מאוד איטי.הכי טוב אם יכולתי איכשהו לקמפל את הפייתון ולהשתמש בפונקציות ממנו כAPI, אבל זה נשמע לי דורש עבודה רצינית.
אם לא, אז אולי יעזור גם לקמפל את הפייתון ולהריץ אותו כEXE, כי נראה לי שמה שלוקח את זהמן זה הפעלת הסביבה הוירטואלית כל פעם. אבל איך מקפלים פייתון שתלוי בVENV?
דרך שלישית שחשבתי היא להפעיל תהליך מNODEJS שמפעיל את הסביבה וירטואלית פעם אחת ואז כל פעם להשתמש באותו תהליך לקרוא לסקריפט, אבל אין לי מושג איך עושים את זה, אם אפשרי. כל זה בהנחה שמה שגוזל את הזמן זה הפעלת הVENV (מה שבטוח שהסקריפט נטו לוקח הרבה פחות מהפרוצדורה ברוטו, בדקתי) -
@davidnead אמר בהרצת פרוייקט פייתון מnodejs:
הפעלת הסביבה הוירטואלית
כל העבודה של "הפעלת הסביבה הוירטואלית" אאל"ט זה סה"כ מגדיר משתני סביבה?
-
@yossiz אני לא בדיוק יודע. לכאורה אתה צודק. בפועל סקריפט שלוקח בפייתוח פחות משניה לוקח 3 שניות בצורת ההרצה הבאה:
let cmd = `cd ${pyPath} && venv\\scripts\\activate && python script.py arg1 arg2 `; stdout = await exec(cmd);
בדקתי את זה ע"י שעשיתי טיימר פנימי בתוך הפייתון מתחילת עד סוף פעולת הסקריפט והדפסתי אותו לstdout שקראת בJS תוך הפעלת טיימר מקביל בJS.
משהו בהרצת הפרוצס בצורה כזו לוקחת זמן. אם זו הפעלת הסביבה וירטואלית? זה רק ניחוש. מה שבטוח שזו דרך מסורבלת, וכנראה יש דרכים טובות יותר.
-
@davidnead סליחה על ההתווכחות שאולי לא עוזר לך כלל, אבל הבדיקה שעשית לא מצביע על כך שזה בעיית ה-venv אלא שיש תהליך איטי לפני הרצת השורה הראשונה של פייתון שכתבת, זה יכול להיות טעינת ספריות וכדומה
בכל מקרה, השאלה שלך עומדת, איך מריצים פייתון מנוד בצורה יעילה
-
@yossiz אמר בהרצת פרוייקט פייתון מnodejs:
@davidnead סליחה על ההתווכחות שאולי לא עוזר לך כלל, אבל הבדיקה שעשית לא מצביע על כך שזה בעיית ה-venv אלא שיש תהליך איטי לפני הרצת השורה הראשונה של פייתון שכתבת, זה יכול להיות טעינת ספריות וכדומה
בכל מקרה, השאלה שלך עומדת, איך מריצים פייתון מנוד בצורה יעילה
אני לא מתווכח, בחלט יתכן שאתה צודק.
לגבי טעינת ספריות - אכן נתקלתי בבעיה כי אי אפשר לבצע קוד לפני טעינת ספריות אז אין לי דרך למדוד את הזמן שזה לוקח. אולי שם הבעיה.אני מאמין שהדרך (שתפתור גם זה) צריכה לדמות הפעלת פרוייקט פייתון והשארתו פתוח, תוך שיגור קלט ופלט כעין פעולת משתמש.
למעשה זו שאלה כללית בNODEJS כיצד מחזיקים תהליך פתוח ושולחים לו קלט של פקודות כדי לבצע אינטרקציה. זה נשמע לי גם מתכון לצרות אם אתה עובד בצורה אסינכרונית (וברור שכך). יצא מן סלט של לזרוק פקודות לפייתון בלי לדעת באיזה סדר הם הגיעו והרי הפייתון עצמו סינכרוני, להמתין לתשובות ולנסות להבין איזו תשובה הגיעה על מה. -
-
@davidnead אני לא חושב שזה כל כך בעייתי כמו שאתה מתאר
הכי קל, והדבר שאתה מן הסתם הכי מכיר, זה לעשות שרת flask פשוט ביותר ולשלוח לו את הבקשות דרך localhost
מן הסתם יש דרכים קלילים יותר דרך pipe אבל עם סיריאליזציה שתדאג שהבקשות והתשובות לא יתערבבו (אולי לא מתאים, תלוי מה בדיוק הסיטואציה, ומה המקסימום זמן שאורך כל בקשה)
עריכה: נראה לי שהכי מתאים לכזה התקשרות בין תהליכים הוא unix domain socket אבל אני לא יודע מה המצב של זה בווינדוס, נראה לי שבעקרון flask יודע להאזין על unix socket, וזה מוריד כל התקורה של TCP/IP
סליחה על כל הקשקושים -
@yossiz אמר בהרצת פרוייקט פייתון מnodejs:
@davidnead אני לא חושב שזה כל כך בעייתי כמו שאתה מתאר
הכי קל, והדבר שאתה מן הסתם הכי מכיר, זה לעשות שרת flask פשוט ביותר ולשלוח לו את הבקשות דרך localhostלא רציתי שתגידו לי שרת, רציתי להיפטר מזה... כאיש פולסטאק זה לכאורה המושכל ראשון לתכנה שמאזינה לכמה קריאות במקביל, אבל מעדיף לא להתעסק עם שרת.
מן הסתם יש דרכים קלילים יותר דרך pipe אבל עם סיריאליזציה שתדאג שהבקשות והתשובות לא יתערבבו (אולי לא מתאים, תלוי מה בדיוק הסיטואציה, ומה המקסימום זמן שאורך כל בקשה)
זהו שאני לא מעלה דעתי איך לעשות את הסיראליזציה הזו כמו שצריך, ובכלל לא מכיר את הדרכים הקלילות הללו.
עריכה: נראה לי שהכי מתאים לכזה התקשרות בין תהליכים הוא unix domain socket אבל אני לא יודע מה המצב של זה בווינדוס, נראה לי שבעקרון flask יודע להאזין על unix socket, וזה מוריד כל התקורה של TCP/IP
טוב, כאן כבר איבדתי אותך.
-
-
אני מניח שזה כבר לא רלוונטי, אבל אשים פה קישור מעניין:
https://pyodide.org/en/stable/usage/index.html#node-js