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

时间:2015-05-01 03:39:26

标签: python python-2.7 pip

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

导入它
from pymavlink import mavlinkv10 as mavlink

并且解释器抛出此错误:

  

文件“/Library/Python/2.7/site-packages/pymavlink/mavlinkv10.py”,第10行,在   from ... generator.mavcrc import x25crc   ValueError:尝试相对导入超出toplevel包

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

2 个答案:

答案 0 :(得分:4)

看起来没有人会在教科书上回答这个问题,所以我将继续发布如何在Raspberry Pi上拼凑丛林联盟python mavlink安装而且,希望有人会在未来发布一个合法的解决方案,以便如何正确地使用PIP。欢迎任何评论/修复!

通过输入" sudo pip install pymavlink"来安装pymavlink。这会将pymavlink模块(以及您必须修改的mavlinkv10.py文​​件)安装到pi" /usr/local/lib/python2.7/dist-packages/pymavlink/&上的以下目录中#34;

在你的python代码开头使用以下行导入pymavlink模块"从pymavlink import mavlinkv10导入mavlink"

当从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个父目录进行相对导入" up" (我认为?)。自"发电机"目录实际上是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计算失败了。你可以修复&#34;通过关闭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&#34;计算将影响mavlink可靠性(可能不是积极的)。

答案 1 :(得分:2)

而不是使用

from pymavlink import mavlinkv10 as mavlink

from pymavlink.dialects.v10 import common as mavlink

用您可能需要的任何方言替换common(有关所有选项,请参阅https://github.com/mavlink/mavlink/tree/master/message_definitions/v1.0中的XML文件)