[英]which and type show different paths to IPython executable in virtualenv, import fails in IPython, succeeds in standard interpreter?
(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()
為什么which
和type
指向不同的路徑? 為什么,如果在我的virtualenv中安裝了IPython,系統IPython是否會被執行,即使我的$PATH
的順序會另外指示? 在任何情況下,為什么import novaclient
炸彈出來似乎是一個非常奇怪的錯誤?
(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']
(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']
為什么哪個和類型指向不同的路徑?
如果你的shell已散列ipython
的路徑, type
會給你的散列路徑,而不搜索$PATH
,而which
將忽略散列路徑進行搜索。
假設您的shell是bash
, hash
命令(沒有args)將顯示散列路徑,或者您可以查看BASH_CMDS
關聯數組。 但你已經知道ipython
是哈希,因為type
只是告訴你。
通常你可以通過啟動一個新的shell,使用hash -r
命令(擦除緩存而不重新啟動任何其他東西)或hash -d ipython
(從緩存中刪除ipython
來解決這個問題,但要確保你沒有也有例如緩存中的python
)。 對於不同的shell,這兩個命令可能不同(例如,在* csh和zsh中,它分別是rehash
和rehash ipython
),但是啟動一個新的shell應該總是有效。
有關更多詳細信息,請參閱bash參考手冊中的命令搜索和執行 ,或系統上的bash(1)
聯機幫助頁,或者如果您使用類似“bash hash cache”的內容,將會顯示許多更易於理解的博客帖子“(像這一個 )。
為什么,如果我的virtualenv中安裝了IPython,系統IPython會被執行
如果你的shell有散列ipython
的路徑, ipython
將從散列路徑運行,而不搜索$PATH
。
再次,啟動一個新的shell等應該解決這個問題。
在任何情況下,為什么導入novaclient炸彈出來似乎是一個非常奇怪的錯誤?
很可能它會從您的環境中獲取PYTHONPATH
,這會導致venv的站點包和dist-packages成為系統Python,並且這些位置的包不能與系統Python一起使用。
您可以通過打印出sys.path
來驗證這一點。 但它抱怨/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/
文件這一/Users/sam/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/
意味着此路徑必須位於sys.path
。 而且(因為你從不同的目錄運行)不僅僅是因為默認.
正在接受它,但因為它明確地存在。 所以, sys.path
可以告訴你的是它是絕對路徑還是相對路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.