python - 如何(正确)使用 PIP 安装和导入 pymavlink

标签 python python-2.7 pip

我正在使用 OS X Yosemite 并尝试使用 pip 和 python 2.7 设置 pymavlink。输入 sudo pip install pymavlink,它安装得很漂亮。尝试用

导入它
from pymavlink import mavlinkv10 as mavlink

解释器抛出这个错误:

File "/Library/Python/2.7/site-packages/pymavlink/mavlinkv10.py", line 10, in from ...generator.mavcrc import x25crc ValueError: Attempted relative import beyond toplevel package

我想我理解错误并且可以通过将包的隐式导入“...generator”更改为显式“pymavlink.generator”来手动“修​​复”它。我的问题是,使用 pip 安装和导入此包的正确方法是什么。我不可能是第一个遇到这个问题的人:)

最佳答案

看起来没有人用教科书式的答案来插话这个问题,所以我将继续并发布我是如何在 Raspberry Pi 上拼凑出一个丛林联盟 python mavlink 安装的,并希望,将来会有人发布关于如何使用 PIP 正确执行此操作的合法解决方案。欢迎任何评论/修复!

输入“sudo pip install pymavlink”安装pymavlink。这会将 pymavlink 模块(以及您必须修改的 mavlinkv10.py 文件)安装到 pi 上的以下目录“/usr/local/lib/python2.7/dist-packages/pymavlink/”

在您的 python 代码“from pymavlink import mavlinkv10 as mavlink”开头使用以下行导入 pymavlink 模块

从 pymavlink 仓库运行 pymavlink 示例代码时,解释器首先会抛出如下错误:

File "/Library/Python/2.7/site-packages/pymavlink/mavlinkv10.py"
in from ...generator.mavcrc import x25crc 
ValueError: Attempted relative import beyond toplevel package

看起来 mavlinkv10.py 正试图从 3 个父目录“向上”(我认为?)进行相对导入。由于“生成器”目录实际上是 mavlinkv10.py 所在的子目录,因此我在 mavlinkv10.py 中更改了以下内容:

changed this:  from ...generator.mavcrc import x25crc
to this:       from generator.mavcrc import x25crc

接下来,当您运行尝试创建(编码)新 mavlink 消息的 python mavlink 代码时,解释器将抛出以下错误:

File "/usr/local/lib/python2.7/dist-packages/pymavlink/mavlinkv10.py", line 1053, in pack
return MAVLink_message.pack(self, mav, 137, struct.pack('<QI', self.time_unix_usec, self.time_boot_ms))
File "/usr/local/lib/python2.7/dist-packages/pymavlink/mavlinkv10.py", line 110, in pack
crc.accumulate(chr(crc_extra))
File "/usr/local/lib/python2.7/dist packages/pymavlink/generator/mavcrc.py", line 18, in accumulate
tmp = b ^ (accum & 0xff)
TypeError: unsupported operand type(s) for ^: 'str' and 'int'

看来 mavlinkv10 在 pack() 函数中的额外 crc 计算失败了。您可以通过关闭 mavlinkv10 的 pack() 函数中额外的 crc 内容来“修复”此错误。注释掉 mavlinkv10.py 中的这两行:

#if True: # using CRC extra
#    crc.accumulate(chr(crc_extra))

最后一件事。您还需要在 mavlinkv10.py 的 decode() 函数中禁用 crc2 计算。注释掉 mavlinkv10.py 中的这些行:

#if True: # using CRC extra 
#    crc2.accumulate(chr(crc_extra))
#if crc != crc2.crc:
#    raise MAVError('invalid MAVLink CRC in msgID 

此时,您应该能够运行 pymavlink 示例代码,尽管我不清楚禁用“额外 CRC”计算将如何影响 mavlink 可靠性(可能不是积极的)。

关于python - 如何(正确)使用 PIP 安装和导入 pymavlink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981304/

相关文章:

python - 如何从 SQLAlchemy 获取最新对象

python - 如何在支持 mx 的 virtualenv 中安装 psycopg2?

python - 从python中的numpy npz文件加载数组

python - 如何使用 requirements.txt 中的 pip 和 setup.py 安装 github zip 文件?

pip - Elastic Beanstalk 的错误 python 版本

Python 迭代 cx_Oracle 结果集时出错

python - 运行包含管道的命令行并将结果显示到 STDOUT

python-2.7 - 如何使用 matplotlib 颜色条中的偏移表示法更改尾数的位数

python 在继续之前等待第n位数字

python - "SSL certificate verify failed"使用pip安装包