python虚拟环境中$PATH被忽略

1 投票
2 回答
537 浏览
提问于 2025-04-18 08:00

我有一个虚拟环境(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

我不太明白为什么,但在我先关闭虚拟环境再重新打开之后,一切都正常了...

撰写回答