ipython 读取错误的 python 版本
Posted
技术标签:
【中文标题】ipython 读取错误的 python 版本【英文标题】:ipython reads wrong python version 【发布时间】:2012-03-12 06:20:53 【问题描述】:我在使用 Python、iPython 和库时遇到了麻烦。以下几点显示了问题的链条。我在 Mac Lion 上运行 Python 2.7。
-
iPython 不读取 scipy、matplotlib 的库,但它确实读取了 numpy。
为了解决这个问题,我尝试安装 Python 的源代码版本,但它只会给我带来更多问题,因为现在我有两个不同的版本:2.7.1 和 2.7.2
我注意到运行 Python 时,使用 2.7.2 版本并导入 scipy、matplotlib 和 numpy,但在 iPython 上,版本是 2.7.1,它不会打开 scipy 或 matplotlib。
我尝试了一些我在其他博文中遇到的事情。但他们都没有帮助,而且不幸的是我不太清楚我在用他们中的一些人做什么。例如: 我尝试使用 easy_install 和 pip 卸载并重新安装 ipython。我还尝试通过自制软件重新安装所有内容,并修改路径 .bash_profile。
【问题讨论】:
ipython
脚本与它安装时使用的特定 Python 版本“绑定”——它不会自动切换到您上次安装的版本。如果你先安装 2.7.1,然后是 IPython,然后是从源代码安装 2.7.2,你的 IPython 将继续使用 2.7.1。您需要撤消所有的甩尾操作,回到原来的 Python 版本并找出第 1 点背后的原因;或者,使用可以访问所需库的任何 Python 安装重新安装 IPython。
你能说得更具体点吗?...谢谢
具体是哪一部分? IPython 启动是如何工作的,或者如何解决这个问题?
本质上,当你安装任何python“程序”时,比如IPython甚至easy_install,程序的启动脚本被设置为总是使用安装它的python可执行文件。因此,如果您有没有库的 Python 2.7.1,然后安装 IPython,IPython 将安装“到”Python 2.7.1 安装中,并且指向 ipython
可执行文件的链接放置在您的 PATH 中。如果您随后从源代码安装 Python 2.7.2,它是一个新的、单独的 Python 副本,它不会升级包含 IPython 的现有 2.7.1。所以 IPython 不会看到 2.7.2 的副本,或者其中的任何库。
库的工作方式相同。如果您安装了 numpy 等。在从源代码安装 Python 2.7.2 之后,它们很可能已安装到 2.7.2 目录中。这意味着 Python 2.7.1 版本根本看不到这些库。由于 IPython 是随 2.7.1 一起安装的,因此它也看不到这些库。基本上,您可以在系统上拥有任意数量的完全独立的 Python 副本,但很难跟踪哪个副本用于什么。除非你知道自己在做什么,否则最好从 Python 的内置版本开始,然后重新安装缺少的库
【参考方案1】:
好的快速修复:
which python
给你/usr/bin/python
,对吧?做
which ipython
我敢打赌那一定是/usr/local/bin/ipython
。让我们看看里面:
编辑 9/7/16 -- 文件现在如下所示:
cat /usr/local/bin/ipython
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from IPython import start_ipython
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(start_ipython())
我的工作正常,但我的情况与 OP 的情况不完全一样。
原始答案 -- 2013 年 9 月 30 日:
cat /usr/local/bin/ipython
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'ipython==0.12.1','console_scripts','ipython'
__requires__ = 'ipython==0.12.1'
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('ipython==0.12.1', 'console_scripts', 'ipython')()
)
啊哈 - 在您的编辑器中打开 /usr/local/bin/ipython
(使用权限),并将第一行更改为
#!/usr/local/bin/python
保存,启动 iPython,应该说它正在使用你现在想要的版本。
【讨论】:
有疑问,python -m IPython
等价于ipython
,希望你确定使用正确的 Python。
还记得关闭终端并打开一个新终端。因为 PATH 被 shell 缓存以提高效率。这就是我让这个解决方案为我工作的方式。见:conda.pydata.org/docs/…
@马特。我也经历过。我的情况是“python -m IPython”将调用我想要的正确版本。但只是“ipython”,它启动了一个使用旧 python2 的副本。神秘的是,如果我做一个“which ipython”,它指向 virtualenv 副本,该 python 文件内容显然是正确的。
我使用@kawingkelvin,例如,使用带有其他python版本的pyenv将无法使用ipython
,但可以使用python -m IPython
。似乎这些是不同的入口点,使用不同的变量。【参考方案2】:
张贴@Matt 的评论作为答案,这样它就更显眼了
python -m IPython
将 ipython 作为模块加载,首先在路径上可以访问任何 python。就我而言,我预先安装了一个,并从 brew 添加了一个。这简直完美。
【讨论】:
也许不是这个问题的答案,但这是问题的答案:“如何在安装任何 python 版本的情况下运行 ipython”。谢谢。 重要提示:上面的命令对我有用,但一开始它给了我错误/usr/bin/python: No module named IPython
。为了解决这个问题,我运行了python3.7 -m pip install IPython
,而他们的命令python -m IPython
就像一个魅力:)。只是让你知道。
谢谢!这正是我一直在寻找的。我试过python -m ipython
并且想知道是否可以以这种方式在我安装的不同python 版本(3.8 与系统的3.6)之间消除歧义。当然,在为每个版本安装 IPython 之后。
为了使您的工作流程更加简洁,您可能会发现在您的 bash 配置文件或任何适用的源配置文件中添加适用于您的上述语句会很方便。例如,我添加了alias ipython='python -m IPython'
,现在只需在我的终端中使用ipython
,现在就可以忘记每天的细节。【参考方案3】:
使用 virtualenv 怎么样? 我很喜欢。也许这不是更快的方式,但我认为它很清楚。
创建 virtualenv 时,可以使用 -p 标志指定 python 路径。
对于 python 2.7
$ virtualenv -p /usr/bin/python2.7 venv2.7
$ source venv2.7/bin/activate
(venv2.7)$ pip install ipython
(venv2.7)$ ipython
对于 python 3.4
$ virtualenv -p /usr/bin/python3.4 venv3.4
$ source venv3.4/bin/activate
(venv3.4)$ pip install ipython
(venv3.4)$ ipython
【讨论】:
这是一个旧线程,但我也遇到过 virtualenvs,并且喜欢它们非常适合开发产品。然而,出于“日常”分析的目的,我宁愿在我的系统中直接使用 python/ipython 的可用版本。python -m IPython
将使用给定版本的python
启动 ipython
请注意 python -m IPython
需要安装:pip install ipython
【参考方案4】:
首先,我会确保您使用的是正确的 python。在命令提示符下键入:
which python
python -V
第一个告诉你路径,第二个告诉你正在使用的 Python 版本。
【讨论】:
好的,它在 /usr/local/bin/python 上给了我 Python 2.7.2【参考方案5】:我的解决方案简单、愚蠢但很有效。
我使用python -V
来确定是什么版本
$ python -V
Python 2.7.10
然后在 .bash_profile 中创建别名
$ vi ~/.bash_profile
添加一行
alias ipython="python -m IPython"
然后你会在 python 2.7 中得到一个ipython
。 ?
(顺便说一句,我的ipython
是通过homebrew
安装的,它默认会在python 3 中运行ipython。)
$ brew install ipython
【讨论】:
【参考方案6】:非常相关:http://conda.pydata.org/docs/troubleshooting.html#shell-command-location。
td;lr 问题是由于 shell '散列'和路径变量而遇到的。
【讨论】:
一般的好习惯是在 virtualenv 中安装 ipython。你的which python
应该指向 virtualenv python 二进制文件。
即使在 virtualenv 中安装了 ipython 之后,shell 散列也让我感到厌烦。 hash -r
为我修好了;谢谢!【参考方案7】:
使用pyenv的类似方法
pyenv install 3.4.5
pyenv local 3.4.5
pip install ipython
ipython
现在它会显示正确的python版本
Python 3.4.5
【讨论】:
【参考方案8】:我能想到的绝对简单的解决方案,不需要摆弄环境、安装的文件或其他任何东西,它依赖于以下事实:
-
可执行文件
ipython
实际上是一个Python脚本。
IPython 包是为您运行 pip intall
的每个解释器单独安装的。
如果你运行的 Python 版本安装了 IPython 包,你可以这样做
/path/to/desired/python $(which ipython)
这将使用您想要的解释器而不是 shebang 中列出的解释器运行 ipython
脚本。
【讨论】:
不是每次都调用上面的,如何设置为默认值,这样每次我在shell中输入ipython
时,它都会自动读取自定义解释器而不是默认值?跨度>
在默认路径之前添加一个执行此操作的脚本。但是你必须弄乱环境才能做到这一点。【参考方案9】:
你的问题基本上是让 ipython 使用正确的 python。
所以解决问题的方法是让 ipython 使用正确的 python(安装了 scipy 等库)
我在这里写了一个解决方案:
How to make iPython use Python 2 instead of Python 3
【讨论】:
【参考方案10】:我遇到了同样的问题,但以下是在 OSX 12、Sierra 上对我有用的唯一解决方案。
ipython 总是为 python 3.6 启动,但我需要它用于 2.7。我找不到 2.7 的 ipython 启动脚本,也找不到使用 python -m
执行的 IPython 模块。 brew instally ipython
pip install ipython
或 pip2 install ipython
都不能给我 2.7 版本。所以我手动得到它。
brew install ipython@5
从here 安装2.7 版本,但不会将其放在您的$PATH
上,因为它知道名称与另一个包冲突。
ln -s /usr/local/Cellar/ipython@5/5.5.0_1/bin/ipython /usr/local/bin/ipython2
将解决此问题,让您只需在 shell 提示符下运行 ipython2
对我来说,因为我对使用 ipython for 2.7 很认真,所以我还运行了以下命令。
ln -s /usr/local/Cellar/ipython/6.2.1/bin/ipython /usr/local/bin/ipython3
rm -f /usr/local/bin/ipython
ln -s /usr/local/bin/ipython2 /usr/local/bin/ipython
【讨论】:
【参考方案11】:如果您使用 anaconda 或其他一些虚拟环境包装器,此处提到的所有答案都无助于解决问题。
此答案基于您使用 anaconda 的假设。
假设您在 python 3 环境中,在 jupyter notebook 上创建笔记本时,它显示“Python 2”而不是“Python 3”。
这是因为“ipython”本质上是一个运行的脚本,在这个脚本中它提到了它用于执行命令的 python 版本。你需要做的就是改变这一行,让 ipython 使用你想要的 python 版本。
首先停止ipython服务器,使用命令“which python”获取当前环境的python可执行文件的位置
我的输出是:
/home/sourabh/anaconda2/envs/py3/bin/python
现在使用命令“which ipython”获取ipython的可执行位置
我的是:
/home/sourabh/anaconda2/envs/py2/bin/python
请注意,它使用的是不同版本的 python 即。来自特定环境的python 运行不同版本的python,即从不同环境运行python。
现在导航到目录 anaconda2/bin(对于 anaconda 3 用户,它应该是 anaconda3/bin )并搜索“ipython”文件。在此编辑中,将第一行指向您想要的当前 python 版本。即“which python”的输出,即:
#!/home/sourabh/anaconda2/envs/py3/bin/python
请注意,我将 python 环境从 py2(运行 python 2.7)更改为 py3(运行 python 3.5)。
保存文件。并运行 jupyter notebook,现在在创建新笔记本时,“Python 3”选项应该是可见的。
干杯!
【讨论】:
【参考方案12】:对我来说,在 Windows 10 上,我的 ipython.exe 与我的 python 不匹配。 我知道这是因为 ipython 说过
----> 3 from pywinauto import handleprops
4 from pywinauto import timings
5 from pywinauto.application import Application
ModuleNotFoundError: No module named 'pywinauto'
但是,当我使用 > python
执行包含程序时,这有效
这是不匹配的地方。
ipython 信息
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
[DOT DOT DOT]
python信息
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
这是我的解决方法。
我将引用更改为 Python\...\Scripts
,这是 ipython.exe 隐藏的地方
-
我在设置 - 环境变量中更改了我的系统路径
C:\Users\joeco\AppData\Roaming\Python\Python38\Scripts
现在C:\Users\joeco\AppData\Roaming\Python\Python39\Scripts\
-
将上述值UP移至路径顶部
重启
结果
-
ipython 现在匹配 python
ipython
from pywinauto import handleprops
成功
【讨论】:
【参考方案13】:我安装了 python2.7、python3.6 和 python3.8
sahil@rubeus:~$ ls -ls /usr/bin/python*
0 lrwxrwxrwx 1 root root 9 Apr 16 2018 /usr/bin/python -> python2.7
0 lrwxrwxrwx 1 root root 9 Apr 16 2018 /usr/bin/python2 -> python2.7
3548 -rwxr-xr-x 1 root root 3633000 Feb 27 20:40 /usr/bin/python2.7
0 lrwxrwxrwx 1 root root 9 Oct 25 2018 /usr/bin/python3 -> python3.6
4424 -rwxr-xr-x 2 root root 4526456 Jan 26 21:03 /usr/bin/python3.6
5016 -rwxr-xr-x 1 root root 5134032 Jun 3 23:23 /usr/bin/python3.8
我在这个位置有 ipython 文件
sahil@rubeus:~$ which ipython
/home/sahil/.local/bin/ipython
它有以下内容
#!/usr/bin/python2
# -*- coding: utf-8 -*-
import re
import sys
from IPython import start_ipython
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(start_ipython())
所以我只是在同一位置复制了该文件的两个副本,名称分别为 ipython3.6 和 ipython3.8,并更新了第一行以指向特定的 python 版本,在我的例子中是 /usr/bin/python3.6
和 /usr/bin/python3.8
。
所以现在有 3 个文件,每个文件都指向特定的 python 版本
sahil@rubeus:~$ ls ~/.local/bin/ipython*
/home/sahil/.local/bin/ipython
/home/sahil/.local/bin/ipython3.6
/home/sahil/.local/bin/ipython3.8
现在,当我需要启动 python2 时,我只需从终端运行 ipython,在 python3.8 中获取 ipython 的方法相同,我运行 ipython3.8
sahil@rubeus:~$ ipython3.8
Python 3.8.11 (default, Jul 3 2021, 17:53:42)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
注意:您可能需要使用命令python3.6 -m pip install IPython
或python3.8 -m pip install IPython
为特定的python 版本安装ipython。不知道是用python安装的还是单独安装的。
【讨论】:
以上是关于ipython 读取错误的 python 版本的主要内容,如果未能解决你的问题,请参考以下文章