#! /usr/bin/env python 呼叫了错误的Python解释器

8
这里发生了什么事情?!
$ /usr/bin/env which python
/home/dbanas/.local/bin/python

$ /home/dbanas/.local/bin/python -V
Python 2.7.3 -- EPD_free 7.3-2 (64-bit)

$ /usr/bin/env python -V
Python 2.4.3

我偶然发现这个问题,当我试图调试一个使用#! /usr/bin/env python作为第一行的Python脚本时,我不明白它是如何运作的。
谢谢! -db
我刚刚注意到'~/.local/bin/python'是一个链接,而不是可执行文件。这会破坏'/usr/bin/env...'的流程吗?
也许,更简洁地表达基本难题的方式是:
$ env python -V
Python 2.4.3

$ python -V
Python 2.7.3 -- EPD_free 7.3-2 (64-bit)

越来越好奇:

$ which python
/home/dbanas/.local/bin/python

$ python -c 'import sys; print sys.executable'
/usr/bin/python

1
问题实际上与shebang无关,而是与env运行的版本不同于“which”所述的版本有关。您可能需要澄清问题。您使用哪个shell?您的路径中“env”(单独)报告了什么? - agentp
@klashxx,我在“#!”和“/usr/bin/env”之间有一个空格。这是你的意思吗?删除该空格似乎并没有改变行为。 - dbanas
@george,是的,我同意,对我来说难以理解的是:“如何通过'/usr/bin/env which python'得到与'/usr/bin/env python'调用的不同版本的python?”我正在使用bash。'"/usr/bin/env | grep '^PATH'"得到的结果是:PATH=/apps/lsf/9.1/linux2.6-glibc2.3-x86_64/etc:/apps/lsf/9.1/linux2.6-glibc2.3-x86_64/bin:/bin:/.local/bin:... 我已经确认在'~/.local/bin'之前的所有目录中都找不到'python'。 - dbanas
我是指where命令可以查看路径上的所有版本,这可能会给出一些提示。 - agentp
2
在bash下尝试输入type -a python。另外,如果您刚刚安装(或移动)了Python可执行文件,请确保运行一个新的shell以便在启动时看到它。 - agentp
显示剩余15条评论
2个回答

4
很可能是因为你的PATH变量没有导出到环境中。在这种情况下,/usr/bin/env将不会设置PATH,并且它的execvp调用最终会搜索一小组默认目录(通常包括/usr/bin)。
要查看这个问题(在bash中):
$ export PATH
$ declare -p PATH  # verify PATH is exported, denoted by the -x
declare -x PATH="<my usual path, omitted...>"
$ /usr/bin/env python -V  # shows my own python build
Python 2.7.6
$ export -n PATH  # un-export PATH
$ declare -p PATH
declare -- PATH="<my usual path, omitted...>"
$ /usr/bin/env python -V  # shows the system (/usr/bin/python) version
Python 2.6.6

因此,总的来说,请确保在您的shell点文件中某处导出 PATH

0

Python 似乎是您的 shell 中的一个 别名。取消它的别名。

unalias python

请重试。


这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - Linger
1
@Linger,抱歉?这对我来说看起来像是一个答案(尽管我认为它不正确——别名会显示在“type”的输出中)。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接