【发布时间】:2020-10-17 10:27:26
【问题描述】:
我有一个 IoT 设备(Android 设备)和一些 python 脚本来与在同一设备上运行的 gRPC 服务器交互(作为一个 Android 应用程序)。我已经交叉编译了 Python3 并且通常它正在工作 - 我能够从 Android 应用程序运行一些 python 脚本(使用Runtime.getRuntime().exec(...) 并传递PATH、PWD、PYTHONHOME、PYTHONPATH、@ 987654326@, ANDROID_ROOT 环境变量)。
使用gRPC的python脚本如下:
...
import gprc
...
channel = grpc.insecure_channel(url)
执行脚本时出现以下错误:
导入错误:没有名为“grpc”的模块
这是物联网设备上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 设备,这可能是不正确的)。
正确的方法是什么(我应该将相关库放在 python 目录树的位置和确切位置)?我可以将任何目录/文件放到脚本所在的同一目录(本地)吗? python 中是否有任何可以轻松准备分发(例如复制/粘贴)的 lite gRPC impl(可能功能有限)?
仅供参考,我尝试使用python -m pip install grpcio --target,然后使用python -m zipapp resources -m "grpc_serial:main",但它甚至无法在本地工作,因为模块cygrpc 也未找到(但如果使用全局安装的grpc 包则工作):
导入错误:无法从“grpc._cython”(../python3/lib/python3.9/grpc/_cython/init.py)导入名称“cygrpc”
如果我运行“python -m pip install cygrpc --target resources”来为 cygrpc 创建一个独立的 dist,我会得到大约 50Mb 的大约 30 个目录(可能是传递的 deps),这简直是疯狂的沉重。
如果有帮助,我可以为site-packages 提供tree 输出。
【问题讨论】:
标签: python android pip package grpc