python虚拟环境中$PATH被忽略
我有一个虚拟环境(virtualenv),在这个环境里我想运行一个fabfile。
这个fabfile是这样开始的:
import httlib2
当我尝试执行
fab --list
来获取可用任务的列表时,我却得到了:
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/fabric/main.py", line 658, in main
docstring, callables, default = load_fabfile(fabfile)
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/fabric/main.py", line 165, in load_fabfile
imported = importer(os.path.splitext(fabfile)[0])
File "/Users/user/Documents/code/fabfile.py", line 5, in <module>
import httplib2
ImportError: No module named httplib2
但是当我这样做的时候:
$ python
Python 2.7.5 (default, Aug 13 2013, 10:53:21)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import httplib2
>>>
它却能正常导入!
我检查了正在执行的fab是什么:
$ which -a fab
/Users/user/.virtualenvs/myenv/bin/fab
/usr/local/bin/fab
/usr/local/bin/fab
而我的$PATH是从这里开始的:
$ echo $PATH
/Users/user/.virtualenvs/myenv/bin:
我觉得我漏掉了什么,但不知为什么在执行fab时它没有找到httplib2。看起来是执行了错误的fab(也就是说,不是我$PATH中找到的第一个),但我无法解释这是怎么回事。
如果我执行pip freeze,我得到:
$ pip freeze
Fabric==1.8.3
ecdsa==0.11
httplib2==0.9
paramiko==1.12.4
pycrypto==2.6.1
wsgiref==0.1.2
任何帮助都将非常感谢。
2 个回答
-1
$PATH 是你的终端用来查找程序的地方。你需要的是 $PYTHONPATH,或者在 Python 中这样做:
import sys; sys.path.append("somedir")
想了解更多关于 Python 中环境变量的内容,可以查看这个链接:https://docs.python.org/2/using/cmdline.html#environment-variables。
看起来你的 "fab" 命令使用的是一个和你 pip 以及其他终端会话不同的解释器。你可以通过上面提到的方法来改变路径,或者在 fab 运行的 Python 环境中安装 httplib2,或者强制 fab 使用你其他的 Python。
1
我不太明白为什么,但在我先关闭虚拟环境再重新打开之后,一切都正常了...