python - which 和 type 在 vi​​rtualenv 中显示 IPython 可执行文件的不同路径,在 IPython 中导入失败,在标准解释器中导入成功?

标签 python python-2.7 virtualenv ipython openstack-nova

(myvirtualenv)[~] sam@iota $ type ipython  
ipython is hashed (/usr/local/bin/ipython)  
(myvirtualenv)[~] sam@iota $ which ipython  
/Users/sam/.virtualenvs/myvirtualenv/bin/ipython  

不管 which 说什么,它都会执行 /usr/local/bin/ipython

(myvirtualenv)[~] sam@iota $ ipython  
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.  
Python 2.7.5 (default, Sep  6 2013, 17:51:18)  

IPython 1.1.0 -- An enhanced Interactive Python.

In [1]:  import novaclient
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-1-93e5b70cb5b9> in <module>()
----> 1 import novaclient

/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/novaclient/__init__.py in <module>()
     16
     17
---> 18 __version__ = pbr.version.VersionInfo('python-novaclient').version_string()

/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/pbr/version.pyc in version_string(self)
     70         if self.version is None:
     71             parts = []
---> 72             for part in self.release_string().split('.'):
     73                 if part[0].isdigit():
     74                     parts.append(part)

/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/pbr/version.pyc in release_string(self)
     62         
     63         if self.release is None:
---> 64             self.release = self._get_version_from_pkg_resources()
     65
     66         return self.release

/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/pbr/version.pyc in _get_version_from_pkg_resources(self)
     55             # installed into anything. Revert to setup-time logic.
     56             from pbr import packaging
---> 57             return packaging.get_version(self.package)
     58
     59     def release_string(self):

/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/pbr/packaging.pyc in get_version(package_name, pre_version)
    820     if version:
    821         return version
--> 822     raise Exception("Versioning for this project requires either an sdist"
    823                     " tarball, or access to an upstream git repository."
    824                     " Are you sure that git is installed?")

Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?

现在强制执行 /Users/sam/.virtualenvs/myvirtualenv/bin/ipython

(myvirtualenv)[~] sam@iota $ `which ipython`
Python 2.7.5
Type "copyright", "credits" or "license" for more information.

IPython 1.1.0 -- An enhanced Interactive Python.

In [1]: import novaclient
In [2]: print "all is well here"
all is well here
(myvirtualenv)[~] sam@iota $ echo $PATH
 /Users/sam/.virtualenvs/myvirtualenv/bin:/usr/local/sbin:/usr/local/lib:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
(myvirtualenv)[~] sam@iota $ python
Python 2.7.5 (default, Sep  6 2013, 17:51:18)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.24)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import novaclient
>>> print "all is well here"
all is well here
>>> exit()  

为什么whichtype指向不同的路径?为什么,如果 IPython 安装在我的 virtualenv 中,系统 IPython 是否得到执行,即使我的 $PATH 的顺序另有指示?无论如何,为什么 import novaclient 会出现一个看似非常奇怪的错误?


编辑

来自错误 session 的 python 路径

(myvirtualenv)[~] sam@iota $ ipython -c 'import sys;sys.path'

['/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages',
 '',
 '/usr/local/bin',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-1.1-py2.7.egg',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Library/Python/2.7/site-packages',
 '/usr/local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/site-packages/IPython/extensions']

成功 session 的 python 路径

(myvirtualenv)[~] sam@iota $ python -c 'import sys;print sys.path'

['',
 '/Users/sam/.virtualenvs/projectx-dev-2/bin',
 '/Users/sam/.virtualenvs/projectx-dev-2/src/pyrax',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python27.zip',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/plat-darwin',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/plat-mac',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/lib-tk',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/lib-old',
 '/Users/sam/.virtualenvs/projectx-dev-2/lib/python2.7/lib-dynload',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages',
 '/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/IPython/extensions']

最佳答案

Why do which and type point to different paths?

如果你的 shell 已经对 ipython 的路径进行了哈希处理,type 将在不搜索 $PATH 的情况下为你提供哈希路径,而 which 将忽略散列路径并进行搜索。

假设您的 shell 是 bashhash 命令(不带参数)将显示哈希路径,或者您可以查看 BASH_CMDS 关联数组。但是您已经知道 ipython 是散列的,因为 type 刚刚告诉您。

通常你可以通过启动一个新的 shell 来解决这个问题,使用 hash -r 命令(删除缓存而不重新启动任何其他东西),或者 hash -d ipython(仅从缓存中删除 ipython——但要确保您没有缓存中的 python)。对于不同的 shell,这两个命令可能不同(例如,在 *csh 和 zsh 中,它分别是 rehashrehash ipython),但是启动一个新的 shell 应该总是有效的.

有关详细信息,请参阅 Command Search and Execution在 bash 引用手册或系统上的 bash(1) 联机帮助页中,或者如果您在 google 上搜索“bash hash 缓存”之类的内容(例如this one ).

Why, if IPython is installed in my virtualenv, does the system IPython get executed

如果你的 shell 已经散列了 ipython 的路径,ipython 将从散列路径运行,而不搜索 $PATH

同样,启动一个新的 shell 等应该可以解决这个问题。

In any case, why does import novaclient bomb out with what seems to be a pretty bizarre error?

很可能是从您的环境中获取 PYTHONPATH,这会导致 venv 的站点包和 dist 包成为系统 Python 的包,并且这些位置的包不适用于系统 Python。

您可以通过打印出 sys.path 来验证这一点。但它提示 /Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/ 中的文件这一事实意味着该路径必须位于 sys.path。并且(因为您从不同的目录运行)不仅因为默认的 . 正在拾取它,而且因为它明确存在。所以,sys.path 只能告诉您它是绝对路径还是相对路径。

关于python - which 和 type 在 vi​​rtualenv 中显示 IPython 可执行文件的不同路径,在 IPython 中导入失败,在标准解释器中导入成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985843/

相关文章:

python - 使用 scipy.signal 查找局部最大值

python - 表包命令 "python setup.py egg_info"失败,错误代码 1

linux - 安装和配置 virtualenv 和 python (Linux)

python-2.7 - 将按 zscore 分组的列添加到 Pandas 数据框

python - 我如何在 QMake 中包含 python.h

python - 将 python virtualenv 克隆到离线服务器

python - 为什么 '(base)' 出现在我的 anaconda 命令提示符中?

python - 使用 django channel 保存数据库更改

python - 使用 urllib 和 Python 3.3 进行简单的 POST

python - 如何获取语料库中某个单词的平均 TF-IDF 值?