Bash 脚本没有正确安装 python 包

Bash script not installing python packages properly

我一直在按照本教程在我的 jetson tk1 上本地安装 openacc,但我发现安装脚本不正确。当我编译 openacc 库时我没有看到任何错误,但是当我尝试编译时我得到一个错误

ubuntu@tegra-ubuntu:~/apps/acc/accull/yacf/examples/acc$ accull -v -o gpu.x  acc_test.c 
 **************************************** 
                 _    _ _      _          
                | |  | | |    | |         
   __ _  ___ ___| |  | | |    | |         
  / _` |/ __/ __| |  | | |    | |         
 | (_| | (_| (__| |__| | |____| |____     
  \__,_|\___\___|\____/|______|______|    
 **************************************** 
 Release 0.4alpha 

* Verbose output
* Output executable name gpu.x
* Processing acc_test.c to ./accull_k3Ty8/acc_test.c
* Building acc_test.c
* Running StS translation 
Traceback (most recent call last):
  File "/home/ubuntu/apps/acc/accull/yacf//bin/c2frangollo.py", line 64, in <module>
    from Backends.Frangollo.Mutators.Common import FrangolloMutatorError
  File "/home/ubuntu/apps/acc/accull/yacf/Backends/Frangollo/Mutators/Common.py", line 33, in <module>
    from Backends.C99.Visitors.LlcFilters import AccScopeReverse, AccScopeFilter
  File "/home/ubuntu/apps/acc/accull/yacf/Backends/C99/Visitors/LlcFilters.py", line 40, in <module>
    from Tools.Tree import NodeNotFound
  File "/home/ubuntu/apps/acc/accull/yacf/Tools/Tree.py", line 34, in <module>
    c_ast = getCurrentLanguageAst()
  File "/home/ubuntu/apps/acc/accull/yacf/Frontend/Shortcuts.py", line 40, in getCurrentLanguageAst
    myclass = __import__(config.FRONTEND_MODULE + '.' + str(name) + "." + str(name).lower() + '_ast', globals(), locals(), [str(name),])
  File "/home/ubuntu/apps/acc/accull/yacf/Frontend/C99/__init__.py", line 16, in <module>
    from .c99_parser import C99Parser
  File "/home/ubuntu/apps/acc/accull/yacf/Frontend/C99/c99_parser.py", line 15, in <module>
    import ply.yacc
ImportError: No module named ply.yacc
! Compilation of acc_test.c FAILED (no Project directory build )
/usr/local/cuda/bin/nvcc -Xcompiler -fopenmp -lrt -lcuda -lOpenCL -lrt -lcuda -arch=sm_20 *.o /home/ubuntu/apps/acc/accull/frangollo/src/libfrangollo.a -o gpu.x
nvlink fatal   : Could not open input file '*.o'
* Finished

http://scelementary.com/2015/04/30/openacc-on-jetson-tk1.html

#!/bin/bash

ACCULLROOT=/home/ubuntu/apps/acc

mkdir -p $ACCULLROOT/source
cd $ACCULLROOT/source

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
wget https://pypi.python.org/packages/source/S/Sphinx/Sphinx-1.3.1.tar.gz
wget http://lxml.de/files/lxml-3.4.2.tgz
wget http://www.dabeaz.com/ply/ply-3.4.tar.gz
wget https://pypi.python.org/packages/source/M/Mako/Mako-1.0.1.tar.gz

tar xvf Python-2.7.9.tar.xz
cd Python-2.7.9/
./configure --prefix=$ACCULLROOT
make -j2 
make install

list=(Sphinx-1.3.1.tar.gz lxml-3.4.2.tgz ply-3.4.tar.gz Mako-1.0.1.tar.gz)
for file in $list
do
  if [ "$file" == "*.tgz" ] 
    name=$(basename $file .tgz)
  then
    name=$(basename $file .tar.gz)
  fi

  tar zxvf $file
  cd $basename
  $ACCULLROOT/bin/python setup.py build
  $ACCULLROOT/bin/python setup.py install
  cd ..

done

有几个问题:

  • 您初始化了一个名为 list 的数组,但您尝试像这样迭代它的元素 for file in $list 这只会迭代第一个元素,因为 $list 就像 ${list[0]}. 使用 for file in "${list[@]}" 遍历整个数组。
  • 不要忘记在扩展中加双引号以防止 Globbing and WordSplitting。 例如 name=$(basename $file .tar.gz)tar zxvf $file 如果变量 file 的值包含空格并且没有双引号(即 $file 而不是正确的形式:"$file" )
  • 我猜你错误地使用了 cd $basename 而不是 cd "$name" - 或者其他什么东西,如果它没有意义的话。无论如何,变量 name 似乎未被使用。
  • 这一行 [ "$file" == "*.tgz" ] 可能是错误的。作者似乎试图将 "$file"glob 模式相匹配。那么,为了做到这一点,必须改变两件事: 1. 使用 [[ 而不是 [,因为命令 [ 根本不支持 glob匹配。 2. 应该删除 *.tgz 周围的双引号 - 否则,"$file" 将与文字 *.tgz 匹配。所以总结 1 和 2,脚本应该使用 [[ $file = *.tgz ]] 而不是 [ "$file" == "*.tgz" ]。我鼓励您进一步阅读 TestsAndConditionals and to see this great FAQ, which is a part of this Bash Guide - 可能是学习 Bash 的最佳(如果不是唯一)资源之一。
  • 脚本不检查cd是否成功退出,只是继续。它会产生不需要的结果。 cd || exit 是首选,但修改它以对用户进行描述。
  • 关于变量 ACCULLROOT :按照惯例,环境变量(PATHEDITORSHELL、...)和内部 shell 变量(BASH_VERSION, RANDOM, ...) 全部大写。所有其他变量名都应该是小写的。自从 变量名称区分大小写,此约定可避免意外覆盖环境和内部变量。