我有一个物联网设备(Android设备)和一些python脚本,可以与运行在同一设备上的gRPC服务器(作为Android应用程序)进行交互。我已经交叉编译了Python3,总体来说它是可以工作的——我能够从Android应用程序运行一些python脚本(使用Runtime.getRuntime().exec(...)
并传递PATH
、PWD
、PYTHONHOME
、PYTHONPATH
、ANDROID_DATA
、ANDROID_ROOT
环境变量)
使用gRPC的python脚本如下所示:
...
import gprc
...
channel = grpc.insecure_channel(url)
执行脚本时,我会出现以下错误:
import error: No module named 'grpc'
以下是IoT设备上python目录的结构(我已经准备好了):
├── 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
...
正如您所看到的,我已经将相关包放到了site-packages
(只需将相同的文件从我的mac机器复制到iot设备,这可能是不正确的)
正确的方法是什么(我应该把相关的lib放在哪里,具体放什么到pythondirs树上)?我是否可以将任何目录/文件放在脚本所在的同一目录中(本地)?python中是否有任何lite gRPC impl(可能功能有限)可以轻松准备分发(例如复制/粘贴)
仅供参考,我曾尝试使用python -m pip install grpcio --target
和python -m zipapp resources -m "grpc_serial:main"
,但由于模块cygrpc
也未找到,因此它甚至在本地也无法工作(但如果使用全局安装的grpc
包,则工作正常):
import error: cannot import name 'cygrpc' from 'grpc._cython' (../python3/lib/python3.9/grpc/_cython/init.py)
如果我运行“python-mpipinstallcygrpc--targetresources”来为cygrpc创建一个独立的dist,我会得到大约50Mb的30个目录(可能是可传递的dep),这简直是太重了
如果有帮助,我可以为site-packages
提供tree
输出
通过使用
Thrift
RPC解决了这个问题(解决方法),它在python方面似乎更轻量级(它只需要在本地安装thrift
和six
deps(在同一目录中))我猜不使用gRPC的根本原因是没有安装可传递的deps(不确定是gRPC还是pip问题)
相关问题 更多 >
编程相关推荐