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

Python 如何使用PIP(正确)安装和导入pymavlink,python,python-2.7,pip,Python,Python 2.7,Pip,我正在使用OS X Yosemite,并尝试使用pip和python 2.7设置pymavlink。键入sudopip install pymavlink,它安装得非常漂亮。试图用 from pymavlink import mavlinkv10 as mavlink 解释器抛出这个错误: 文件“/Library/Python/2.7/site packages/pymavlink/mavlinkv10.py”,第10行,在 从…generator.mavcrc导入x25crc ValueEr

我正在使用OS X Yosemite,并尝试使用pip和python 2.7设置pymavlink。键入
sudopip install pymavlink
,它安装得非常漂亮。试图用

from pymavlink import mavlinkv10 as mavlink
解释器抛出这个错误:

文件“/Library/Python/2.7/site packages/pymavlink/mavlinkv10.py”,第10行,在 从…generator.mavcrc导入x25crc ValueError:尝试在顶级包之外进行相对导入

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

看起来没有人会用教科书上的答案来回答这个问题,所以我将继续发布我是如何在树莓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个父目录“向上”进行相对导入(我想是吧?)。由于“generator”目录实际上是mavlinkv10.py所在的子目录,因此我在mavlinkv10.py中更改了以下内容:

changed this:  from ...generator.mavcrc import x25crc
to this:       from generator.mavcrc import x25crc
#if True: # using CRC extra
#    crc.accumulate(chr(crc_extra))
#if True: # using CRC extra 
#    crc2.accumulate(chr(crc_extra))
#if crc != crc2.crc:
#    raise MAVError('invalid MAVLink CRC in msgID 
接下来,当您运行python mavlink代码试图创建(编码)新的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.py中的decode()函数中禁用crc2计算。在mavlinkv10.py中注释掉这些行:

changed this:  from ...generator.mavcrc import x25crc
to this:       from generator.mavcrc import x25crc
#if True: # using CRC extra
#    crc.accumulate(chr(crc_extra))
#if True: # using CRC extra 
#    crc2.accumulate(chr(crc_extra))
#if crc != crc2.crc:
#    raise MAVError('invalid MAVLink CRC in msgID 
此时,您应该能够运行pymavlink示例代码,尽管我不清楚禁用“额外CRC”计算将如何影响mavlink的可靠性(可能不是积极的)

而不是使用

from pymavlink import mavlinkv10 as mavlink
试一试


common
替换为您可能需要的任何方言(有关所有选项,请参阅中的XML文件)

有人在这里报告了它,但它没有发表任何评论就关闭了(维护人员这样做时很讨厌!):嘿,感谢您的来电。不确定他们为什么要解决这个问题,因为一些用于设置mavlink环境的文档似乎已被弃用。我在gitter上提出了这个问题,其中一位维护人员说,上面的问题通常与PYTHONPATH设置不正确有关,或者可能与直接从源代码加载模块有关(假设他是指在不运行mavgenerate的情况下加载模块)。欢迎评论如何使mavlink的PIP安装顺利进行。我从一个新的PIP安装中得到了相同的错误,所以我不确定这意味着什么。mavlink所做的相对导入通常不是一个好主意,希望他们能解决这个问题。mavlink gitter url是什么?当然,这里有一些相关的gitter聊天:其他人也有同样的问题: