簡體   English   中英

哪個和類型在virtualenv中顯示到IPython可執行文件的不同路徑,在IPython中導入失敗,在標准解釋器中成功?

[英]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()  

為什么whichtype指向不同的路徑? 為什么,如果在我的virtualenv中安裝了IPython,系統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']

為什么哪個和類型指向不同的路徑?

如果你的shell已散列ipython的路徑, type會給你的散列路徑,而不搜索$PATH ,而which將忽略散列路徑進行搜索。

假設您的shell是bashhash命令(沒有args)將顯示散列路徑,或者您可以查看BASH_CMDS關聯數組。 但你已經知道ipython是哈希,因為type只是告訴你。

通常你可以通過啟動一個新的shell,使用hash -r命令(擦除緩存而不重新啟動任何其他東西)或hash -d ipython (從緩存中刪除ipython來解決這個問題,但要確保你沒有也有例如緩存中的python )。 對於不同的shell,這兩個命令可能不同(例如,在* csh和zsh中,它分別是rehashrehash 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM