我已经在网上搜索了一段时间的答案,但这让我很头疼:
我正在使用Ubuntu 12.04,我想从终端执行Python脚本而不使用完整路径。 所以我将/ home / kyril / python / scripts /添加到PATH变量中,将以下内容放入./bashrc:
kyrilpathvariable="/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/kyril/Python/scripts/:/home/kyril/Bash/scripts"
if [ "$kyrilpathvariable" = "$PATH" ]; then
echo PATH already exported
else
PATH=$PATH:/home/kyril/Python/scripts/
PATH=$PATH:/home/kyril/Bash/scripts/
export PATH
fi
(我知道if子句不是必需的,但如果我输入exec bash,我不想在我的PATH中有两次。)
现在的问题是:这完全适用于我的Bash脚本,所以在通过chmod使它们可执行后,我只需输入$ script.sh
即可执行。但是,如果我输入$ python3 script.py
,则会引发以下错误:python3: can't open file 'script.py': [Errno 2] No such file or directory
如果我输入脚本的完整路径,它就可以工作。有谁知道我做错了什么?我是否必须将目录添加到PYTHONPATH? (据我所知,这只对导入模块有帮助。)
谢谢你们!
答案 0 :(得分:5)
当直接调用python3
时,python会运行您告诉它的脚本文件,而不使用$PATH
来查找它。 PYTHONPATH
无关紧要 - 用于搜索Python模块。
我猜你在自己运行script.py
时遇到了错误的解释器问题。我不知道你的脚本的第一行是什么,但它应该是这样的:
#!/usr/bin/env python3
或者如果您需要更精细的控制:
#!/usr/bin/env python3.2
对于Python 2脚本:
#!/usr/bin/env python2
或者:
#!/usr/bin/env python2.7
在尝试使用这些可执行文件之前,应检查这些可执行文件是否存在。
答案 1 :(得分:0)
我猜想当python搜索输入文件时会忽略路径变量。 Python开始在当前目录中搜索“script.py”,不知道是否为该文件声明了路径变量,因此无法找到它。
不幸的是,我不确定如何解决它,但也许更有经验的变量可以启发我们?
答案 2 :(得分:0)
python3 $(type -P script.py)
告诉Bash在PATH
中查找可执行文件并提供其位置和名称。
例如:
$ type -P script.py
/usr/local/bin/script.py
答案 3 :(得分:0)
为避免路径中出现重复条目,您可以执行以下操作:
for dir in Python Bash; do
dir_to_add="$HOME/$dir/scripts"
case ":$PATH:" in
*:"$dir_to_add":*) ;; # path already contains dir, do nothing
*) PATH+=":$dir_to_add" ;;
esac
done