使用subprocess.Popen启动服务报错:无法识别参数&
解决subprocess.Popen启动服务时"&"参数报错的问题
问题原因
&是Shell(如bash)的特殊符号,用于让进程在后台运行,但你直接将命令字符串split成列表传给subprocess.Popen时,&会被当作普通命令参数传递给predictor.py,而你的脚本并不识别这个参数,因此抛出unrecognized arguments: &错误。
解决方案
你需要的是让服务在后台运行并能查看运行情况,不需要把&作为命令参数传递,以下两种方式都能实现:
方式1:通过Shell执行命令(保留nohup和&)
如果想保留原命令的nohup和&,可以给subprocess.Popen添加shell=True参数,让Shell解析这些特殊符号:
start_predict = "nohup python predictor.py --port 8086 &" subprocess.Popen(start_predict, shell=True)
服务的运行日志默认会输出到当前目录的nohup.out文件,直接查看该文件就能了解运行情况。
方式2:不依赖Shell,用subprocess原生参数实现后台运行
这种方式更安全(避免Shell注入风险),同时通过重定向输出到日志文件来查看运行情况:
import subprocess # 将标准输出和错误输出重定向到自定义日志文件 with open("predictor_service.log", "a") as log_file: subprocess.Popen( ["python", "predictor.py", "--port", "8086"], stdout=log_file, stderr=subprocess.STDOUT, start_new_session=True # 实现类似nohup的终端脱离效果 )
之后查看predictor_service.log文件就能获取服务的运行日志,进程会在后台持续运行。
内容的提问来源于stack exchange,提问作者david129
相关产品推荐
相关产品推荐

