Chrome原生消息主机调用Pipenv环境及Flask CLI命令失败的解决方案咨询
Chrome原生消息主机调用Pipenv环境及Flask CLI命令失败的解决方案咨询
我正在尝试用Flask应用的CLI工具为Chrome扩展处理一些数据。我已经成功配置了原生消息主机,能建立连接接收请求并回复,但触发CLI工具这块遇到了麻烦。
我想用CLI工具做后端的原因是,它既能作为独立的CLI应用运行,又能处理Chrome扩展的各种任务。
目前看来主要问题是,当从扩展调用时,系统识别不了pipenv、python和python3。我想知道有没有办法配置Chrome扩展的原生消息主机,让它要么能使用pipenv shell,要么能访问Flask应用及其CLI命令?我在想是不是必须用服务器,但本地启动/使用(不是远程托管)似乎不太现实。
项目结构
\root \app \commands \pdf_group __init__.py combine.py __init__.py __init__.py app.py Pipfile native_host.py some_script.py
我已经尝试过的方法
- 在
native_host.py中导入代码:from app.commands import my_cli_command
直接导入代码失败,导致原生主机无响应。扩展报错:Unchecked runtime.lastError: Error when communicating with the native messaging host.用完整导入路径from app.commands.pdf_group.combine import my_cli_command也是一样的结果。 - 在
native_host.py中执行os.system("/opt/homebrew/bin/pipenv")
我本地终端用which pipenv得到了这个路径,就试着在原生主机里用,但结果还是一样。 - 执行
subprocess.call("flask pdf combine")
同样无响应。 - 在
native_host.py中import click
还是一样的问题。Click是Flask的依赖,所以我觉得第三方库的特性可能是导致失败的原因之一。 - 在
native_host.py中import some_script并调用some_script.do()
结果依旧。这个脚本在项目根目录下(do()显然不是脚本主函数的合适名字,我希望能找到不需要依赖some_script的解决方案)。
基本上,任何来自应用或CLI应用本身的第三方代码在native_host.py里都无法运行,都会导致原生主机无法响应。
- 执行
os.system("which python")或os.system("which pipenv")
输出结果是错误码256,说明系统找不到这些工具的路径。 - 我在命令行或Python shell里试过所有这些方法,都能正常工作。
临时解决方案(非理想)
我终于让它能运行了,但感觉这不是理想的办法:
- 在终端进入pipenv shell
- 复制
which python3输出的路径 - 在
native_host.py里用这个路径来运行应用:
import os os.system("/Users/bernadette/.local/share/virtualenvs/convert_and_combine_pdfs-mqF7aRtH/bin/python3 ./some_script.py")
看起来关键是直接访问虚拟环境,但这样处理后,原生主机的回复好像没法正常返回。
剩余问题
- 是不是必须用“脚本套脚本”的方式才能让它正常工作?
subprocess.call("...")好像不管用,有没有办法用subprocess代替os.system?
备注:内容来源于stack exchange,提问作者Boom100100
相关产品推荐
相关产品推荐

