4
(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出现看似非常奇怪的错误?


编辑

来自错误会话的pythonpath

(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']

来自成功会话的 pythonpath

(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']
4

1 回答 1

4

为什么 which 和 type 指向不同的路径?

如果你的 shell 有 hashedipython的路径,type会给你 hashed path而不用 search $PATH,同时which会忽略 hashed path 并进行搜索。

假设您的 shell 是bash,该hash命令(没有参数)将向您显示散列路径,或者您可以查看BASH_CMDS关联数组。但是您已经知道这ipython是散列的,因为type刚刚告诉您。

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

有关更多详细信息,请参阅bash 参考手册中的命令搜索和执行bash(1),或系统上的联机帮助页,或者如果您在 Google 上搜索“bash 哈希缓存”之类的内容(如一)。

为什么,如果 IPython 安装在我的 virtualenv 中,系统 IPython 会被执行吗

如果你的 shell 有 hashedipython的路径,ipython将从 hashed 路径运行,而不搜索$PATH

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

无论如何,为什么 import novaclient 会出现看起来很奇怪的错误?

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

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

于 2013-11-14T19:00:24.637 回答