ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Fprime学习(一)-----安装fprime

2021-04-18 23:03:28  阅读:272  来源: 互联网

标签:en LC utf8 US ----- Fprime conda fprime


前言

其实应该有个序章对fprime这个玩意进行介绍,但是我现在还不知道fprime到底怎么部署,能干啥,所以先从安装和tutorials开始写,记录下一些坑

安装过程

官方教程

官方教程是使用python的venv进行虚拟环境管理的,具体按照官方教程操作应该就可以了(虽然我没有试过),官方安装教程在docs/install.md下。我自己安装的环境比较特殊,因此记录下几个坑。
安装的依赖如下:

- Linux or Mac OS X operating system (or Windows Subsystem for Linux on Windows)
- CMake 3.5 or newer https://cmake.org/download/. CLI tool must be available on system path.
- Bash or Bash compatible shell
- CLang or GCC compiler
- Python 3.5+ and PIP https://www.python.org/downloads/
- Python Virtual Environment * (pip install venv or pip install virtualenv) 

如果想要在系统路径下进行安装的话,需要确保系统的/usr/bin/python的软链接是指向python3.x的。

安装过程

我自己的安装环境如下,比较特殊,主要还是conda和ros的问题

- kubuntu 18.04(x64)
- cmake 3.10
- ros1 melodic 和 ros2
- anaconda(用于配置虚拟环境)

conda和ros冲突问题

conda和ros会出现冲突,我个人遇到的问题有以下几个:

  1. 如果在bashrc中有conda环境变量的初始化,那么你初始的python是指向conda的base的
  2. 在conda中调用opencv,会指向ros的opencv

使用conda创建虚拟环境并安装

安装conda的操作就略过了,首先创建一个虚拟环境

conda create -n fprime python=3.7
conda activate fprime

然后对必要包进行升级

pip install --upgrade wheel setuptools pip 

然后就直接pip安装fprime包即可,我这里和官方的稍有不同

cd fprime
cd  Fw/Python
python setup.py install
cd ../Gds
python setup.py install

先转到你clone的根目录,然后转到Fw/Python,然后再转到Gds安装

一个坑点

这个坑我现在也不知道为什么,但硬是通过强制方式使其编译成功了
原文如下:

Testing F Autocoder Installation Via Building Ref Application:
cd Ref 
fprime-util generate 
fprime-util build --jobs "$(nproc ||printf '%s\n' 1)" 

就是通过cmake生成可执行文件测试是否安装成功,就这三行代码,我硬是装了半天

  • 首先第一个问题:fprime-util generate失败
    这个问题的具体输出我忘记了,应该是缺某些包,好像是flask,解决措施如下:
rm -rf build-fprime-xxxxx
conda install Flask
fprime-util generate

首先要删除cmake产生的build文件夹,否则会提示你clean-up,然后安装必要包
但使用pip install的话有些包的依赖没法安装,会报错,所以用conda直接安装
最后generate即可

  • 第二个问题:encode报错
    这个问题就比较迷了,因为python3默认的编码方式是utf-8,理论上不应该出现这个问题,但它还是出现了,错误描述如下:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1156-1157: ordinal not in rang

这里我按照网上教程去设置python的默认编码方式仍然是这个错误,也设置了环境变量为utf-8,但还是一样,因此不应该是这个的问题。
我的语言设置如下

(fprime) lin@lin-SVP1122A1J:~/桌面/FPrime/Ref$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8

所以我一行行找问题,问题最后定位在Cheetah3这个包的某个文件,文件名为:

envs/fprime/lib/python3.7/site-packages/Cheetah3-3.2.6.post1-py3.7-linux-x86_64.egg/Cheetah/Template.py

最后直接修改了Cheetah3的源文件,强制设置utf-8编码,大概在779行左右,源码如下:

		outputEncoding = 'ascii'
        compiler = None
        if useCache and cacheHash and cacheHash in klass._CHEETAH_compileCache:
            cacheItem = klass._CHEETAH_compileCache[cacheHash]
            generatedModuleCode = cacheItem.code
        else:
            compiler = compilerClass(source, file,
                                     moduleName=moduleName,
                                     mainClassName=className,
                                     baseclassName=baseclassName,
                                     mainMethodName=mainMethodName,
                                     settings=(compilerSettings or {}))
            if commandlineopts:
                compiler.setShBang(commandlineopts.shbang)
            compiler.compile()
            generatedModuleCode = compiler.getModuleCode()
            outputEncoding = compiler.getModuleEncoding()
            #--------------------------加入强制设置编码方式-----------------#
            outputEncoding = 'utf8'
            #-------------------------end of update---------------------------#
        if not returnAClass:
            # This is a bit of a hackish solution to make sure
            # we're setting the proper encoding on generated code
            # that is destined to be written to a file.
            if not outputEncoding == 'ascii':
                generatedModuleCode = generatedModuleCode.split('\n')
                generatedModuleCode.insert(
                    1, '# -*- coding: %s -*-' % outputEncoding)
                generatedModuleCode = '\n'.join(generatedModuleCode)

            return generatedModuleCode.encode(outputEncoding)

估计问题就是在cheetah3调用时设置的编码方式默认为ascii导致的问题,所以我直接强制设置了,设置完成后build就很顺利到100%

  1. 第三个问题:flask报错
    nmd,又是flask,这个是在执行最后一个命令发生的,命令为:
fprime-gds -g html -r build-artifacts

错误为:

ImportError: cannot import name 'secure_filename' from 'werkzeug' (/home/lin/anaconda3/envs/fprime/lib/python3.7/site-packages/werkzeug/__init__.py)

这个是可以搜到解决方案的,解决方案如下:
https://blog.csdn.net/sinat_28521487/article/details/105727870
如果找不到flask_uploads.py,可以在虚拟环境的dist-package下键入:

find . -name "flask*.py"

然后编辑即可
最后的效果如图:
在这里插入图片描述

总结

md,一行命令一个bug,我现在都不知道是不是因为是我的环境太奇葩还是nasa这帮人压根当这个是beta版,麻了

标签:en,LC,utf8,US,-----,Fprime,conda,fprime
来源: https://blog.csdn.net/Shi_Technology/article/details/115840906

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有