如何用Python同时运行ngrok与本地服务两个命令行程序?
解决方法
os.system()会阻塞当前Python进程,直到执行的命令运行结束,所以第二个命令必须等第一个完成才会启动。要让两个命令同时运行,有两种常用方案:
方案1:让Shell命令后台执行
在类Unix系统(Linux/macOS)中,给第一个命令末尾加&,让它在后台运行;Windows系统则用start /B命令:
类Unix系统代码
import os os.system('python -m http.server 8000 &') # & 让命令后台运行 os.system('ngrok http 8000')
Windows系统代码
import os os.system('start /B python -m http.server 8000') # /B 表示后台运行不新开窗口 os.system('ngrok http 8000')
跨平台兼容版本
import os import sys if sys.platform.startswith('win'): os.system('start /B python -m http.server 8000') else: os.system('python -m http.server 8000 &') os.system('ngrok http 8000')
方案2:使用Python的subprocess模块(推荐)
subprocess.Popen()可以异步启动子进程,不会阻塞当前Python进程,是更Pythonic的实现方式:
import subprocess import sys # 启动本地HTTP服务,异步执行 server_process = subprocess.Popen( [sys.executable, '-m', 'http.server', '8000'], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 启动ngrok,同步执行(如果需要也可以用Popen异步) ngrok_process = subprocess.Popen( ['ngrok', 'http', '8000'], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 若需要等待两个进程都结束,可取消以下注释 # server_process.wait() # ngrok_process.wait()
你之前分开文件运行仍未解决,大概率是因为每个文件里还是用了os.system()这种阻塞式调用,没有让进程在后台异步执行。
内容的提问来源于stack exchange,提问作者Raymond Jude
相关产品推荐
相关产品推荐

