我有一个IoT设备(Android设备)和一些python脚本,可与在同一设备(作为Android应用程序)上运行的gRPC服务器进行交互。我已经交叉编译了Python3,并且总体上它可以正常工作-我能够从Android应用程序中使用它运行一些python脚本(使用Runtime.getRuntime().exec(...)
并传递PATH
,PWD
,{{1 }},PYTHONHOME
,PYTHONPATH
,ANDROID_DATA
环境变量。
使用gRPC的python脚本如下所示:
ANDROID_ROOT
执行脚本时出现以下错误:
导入错误:没有名为“ grpc”的模块
这是IoT设备上的python目录的结构(我已经准备好了):
...
import gprc
...
channel = grpc.insecure_channel(url)
如您所见,我已经将相关的软件包放到├── bin
├── lib
│ ├── pkgconfig
│ ├── python3.9
│ │ ├── asyncio
│ │ ├── collections
│ │ ├── concurrent
│ │ ├── ctypes
│ │ ├── curses
│ │ ├── dbm
│ │ ├── distutils
│ │ ├── encodings
│ │ ├── ensurepip
│ │ ├── html
│ │ ├── http
│ │ ├── idlelib
│ │ ├── importlib
│ │ ├── json
│ │ ├── lib-dynload
│ │ ├── lib2to3
│ │ ├── logging
│ │ ├── multiprocessing
│ │ ├── pydoc_data
│ │ ├── site-packages
│ │ ├── sqlite3
│ │ ├── tkinter
│ │ ├── turtledemo
│ │ ├── unittest
│ │ ├── urllib
│ │ ├── venv
│ │ ├── wsgiref
│ │ ├── xml
│ │ └── xmlrpc
│ └── site-packages
│ ├── google
│ ├── grpc
│ ├── grpcio-1.30.0.dist-info
│ └── protobuf-3.12.2.dist-info
└── share
├── man
│ └── man1
└── terminfo
...
中(通过将相同的文件从我的mac机复制到iot设备,这可能是不正确的)。
什么是正确的方法(我应该在什么地方以及什么地方将相关的库放到python dirs树中)?我可以将任何目录/文件放在脚本所在的同一目录(本地)吗? python中是否有任何精简的gRPC隐式功能(可能功能有限),可以轻松地进行分发(例如,复制/粘贴)?
仅供参考,我尝试先使用site-packages
,然后再使用python -m pip install grpcio --target
,但由于找不到模块python -m zipapp resources -m "grpc_serial:main"
,它甚至无法在本地工作(但是如果使用cygrpc
包,则可以全局安装):
导入错误:无法从“ grpc._cython”(../ python3 / lib / python3.9 / grpc / _cython / init .py)
导入名称“ cygrpc”
如果我运行“ python -m pip install cygrpc --target resources”以具有cygrpc的独立发行版,我将获得约30个目录(可能是可传递的deps),大约50Mb,这简直太疯狂了。
如果有帮助,我可以为grpc
提供tree
输出。
答案 0 :(得分:0)
使用Thrift
RPC解决了该问题(解决方法),该RPC在python方面似乎更轻巧(仅需要thrift
和six
deps本地安装(在同一目录中))
我想未安装gRPC的根本原因未安装传递性deps(不确定是gRPC还是pip问题)。