Python,virtualenv:激活时出现权限错误

1 投票
2 回答
11496 浏览
提问于 2025-04-18 13:23

我得到了一个笔记本电脑。所以我把我的工作电脑上的 .virtualenvs/ 文件夹复制到了我的网络存储器(NAS),然后又把它复制回我的新笔记本上。

我安装了 virtualenvvirtualenvwrapper,但是我无法让我的虚拟环境正常工作。一开始我得到了这个:

chris@chris-amilo ~ $ workon iwidget
virtualenvwrapper.user_scripts could not run "/home/chris/.virtualenvs/preactivate": [Errno 13] Permission denied
virtualenvwrapper.user_scripts could not run "/home/chris/.virtualenvs/iwidget/bin/preactivate": [Errno 13] Permission denied

然后我对那些文件执行了 chmod +x 命令。虽然之后我可以切换到这个环境,但里面的库都看不见。

我还得到了这个:

chris@chris-amilo ~ $ ./.virtualenvs/iwidget/bin/activate
bash: ./.virtualenvs/iwidget/bin/activate: Permission denied

此外,以下内容显示,虽然我可以在某个环境中使用 workon,但什么都无法导入:(在我对 preactivate 文件执行了 chmod +x 后)

chris@chris-amilo ~ $ workon iwidget
(iwidget)chris@chris-amilo ~ $ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pytz
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pytz
>>> 
(iwidget)chris@chris-amilo ~ $ ls .virtualenvs/iwidget/lib/python2.7/site-packages/py
py4j/                               pytz/
py4j-0.8.1-py2.7.egg-info/          pytz-2014.2-py2.7.egg-info/
python_dateutil-2.2-py2.7.egg-info/ 

我该怎么解决这个问题呢?

2 个回答

1

这个错误提示的意思是,你没有权限去执行那些脚本。我之前也遇到过类似的问题,不过只是针对 .virtualenvs/preactivate 这个文件。

chmod u+x ~/.virtualenvs/*

这个命令对我来说解决了问题,不过我看到你在回答里也提到过。可能这和你从其他机器迁移虚拟环境有关吧?

你可能还需要对 ~/.virtualenvs/iwidget/bin/* 里的文件做同样的操作。

使用 virtualenvwrapper 的话,你不需要在文件夹里直接使用激活脚本,但如果你想这么做,你需要像这样输入命令:

. .virtualenvs/iwidget/bin/activate

注意前面那个点吗?那个点其实是一个命令,虽然很容易被忽略,它是用来激活环境的;激活脚本不能单独运行,文件的前两行会告诉你这一点。命令 source 是点命令的别名。

不过 workon iwidget 应该能处理好这些事情。

至于导入的问题,你可能需要在你的环境里运行 pip install pytz,然后再尝试导入它。要查看它是否在你的环境中,可以输入:pip freeze|grep pytz

1

移动虚拟环境(virtualenv)是个麻烦事。最好的办法是在新机器上重新创建一个虚拟环境。如果你有一个需求文件(requirements file),这就简单多了:只需要运行 pip install -r requirements.txt。如果你没有这个文件,可以在旧机器上用 pip freeze > requirements.txt 来创建一个。

撰写回答