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
:按照惯例,环境变量(PATH
、EDITOR
、SHELL
、...)和内部 shell 变量(BASH_VERSION
, RANDOM
, ...) 全部大写。所有其他变量名都应该是小写的。自从
变量名称区分大小写,此约定可避免意外覆盖环境和内部变量。
我一直在按照本教程在我的 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
:按照惯例,环境变量(PATH
、EDITOR
、SHELL
、...)和内部 shell 变量(BASH_VERSION
,RANDOM
, ...) 全部大写。所有其他变量名都应该是小写的。自从 变量名称区分大小写,此约定可避免意外覆盖环境和内部变量。