4

我已经在网上搜索了很长一段时间的答案,但这让我非常头疼:

我正在使用 Ubuntu 12.04,我想在不使用完整路径的情况下从终端执行 Python 脚本。所以我通过将以下内容放入 ./bashrc 将 /home/kyril/python/scripts/ 添加到 PATH 变量中:

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 吗?(据我了解,这仅有助于导入模块)。

多谢你们!

4

4 回答 4

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

在尝试使用它们之前,您应该检查这些可执行文件是否存在于您的系统中。

于 2012-05-05T11:02:13.730 回答
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
于 2012-05-05T12:38:43.777 回答
0

我猜想当 python 搜索输入文件时路径变量会被忽略。Python 开始在当前目录中搜索“script.py”,但不知道该文件声明了一个路径变量,因此无法找到它。

不幸的是,我不确定如何解决它,但也许对变量更有经验的人可以启发我们?

于 2012-05-05T10:52:41.373 回答
0
python3 $(type -P script.py)

告诉 Bash 在 中查找PATH可执行文件并提供其位置和名称。

例如:

$ type -P script.py
/usr/local/bin/script.py
于 2012-05-05T11:13:43.563 回答