كيف يمكنني إعداد خادم Pydoc المحمول الذي يغلق عندما يتم إيقاف المتصفحات المحمولة؟
سؤال
لقد قمت بإعداد بيئة محمولة على محرك أقراص فلاش الخاص بي تتكون من كروم محمولة ، Firefox Portable و Python 3. أحاول كتابة نص Python 3 الذي سيطلق خادم Pydoc ليتم الوصول إليه إما في محمول الكروم أو Firefox. إذا كانت Chromium Portable نشطة بالفعل ، فسيتم فتح علامة تبويب جديدة للخادم ، إذا لم يتم تشغيل Firefox Portable وسيتم الوصول إلى الخادم من هناك. عند إغلاق جميع عمليات Chromium Portable chrome.exe و Firefox Portable ، يجب إيقاف الخادم. الرمز التالي هو ما كتبته حتى الآن.
import subprocess
import os
drive = os.environ['HOMEDRIVE']
def launch_browser():
pass
def launch_pydoc():
pythonw = drive + '\PortableApps\PortablePython_3x\App\pythonw.exe'
doc_args = drive + '\PortableApps\PortablePython_3x\App\Lib\pydoc.py -p 50000'
spDoc = subprocess.Popen(pythonw+' '+doc_args)
def launch_chrome():
chrome = drive + '\PortableApps\ChromiumPortable\App\Chrome-bin\chrome.exe'
chrome_args = r'http://localhost:50000/ --user-data-dir="C:\Users\Owner\AppData\Roaming\ChromePortable\nathan" --new-tab'
spChrome = subprocess.Popen(chrome+' '+chrome_args)
def launch_mozilla():
mozilla = drive + '\PortableApps\FirefoxPortableNightly\FirefoxPortable.exe'
mozilla_args = 'http://localhost:50000/'
spMozilla = subprocess.Popen(mozilla+' '+mozilla_args)
يتم إطلاق هذا البرنامج النصي من ملف دفعي يحدد قيمة homedrive إلى خطاب محرك الأقراص الفلاش الحالي حتى يعرف Python دائمًا مكان البحث عن المنافسين. مشكلتي هي أنني لست متأكدًا من كيفية تنفيذ العملية التي ستحدد ما إذا كنت ستحدد ببساطة علامة تبويب جديدة في كروم محمولة أو لفتح Firefox Portable ، علاوة على ذلك لإغلاق الخادم بعد كل عملية تم إغلاق المتصفح. لقد نظرت في العديد من الروابط المتعلقة بالعملية الفرعية وما إلى ذلك كيفية انتظار عمليات الأطفال المتعددة, كيف تقتل عملية فرعية و ضمان موت العمليات الفرعية عند الخروج من برنامج بيثون. لقد قمت بتثبيت Pywin32 و WMI و ComTypes و Psutil في نسختي من Python 3. مساعدة من فضلك؟ إذا كان من الضروري تجاهل الكود الخاص بي ، فهذا جيد. أنا أحاول أن أتعلم. شكرا مقدما.
المحلول
من حيث المبدأ ، يجب أن تكون قادرًا على استخدام طريقة Wait () لكائناتك البوب. شيء من هذا القبيل:
pydoc_process = launch_pydoc()
browser_process = launch_browser()
browser_process.wait()
pydoc_process.terminate()
(تعديل وظائف الإطلاق الخاصة بك لتنتهي بها return subprocess.Popen(...
)
لكنني لا أعرف مدى جودة ذلك مع المتصفحات الحديثة. في Linux ، إذا تم استدعاء Firefox لفتح عنوان ، واكتشف أنك قد فتحت بالفعل Firefox ، فإن العملية الجديدة تسلم عنوان URL إلى العملية القديمة ، وتخرج على الفور. هذا النوع من الأشياء من شأنه أن يفسد ما تحاول القيام به.