创建Python虚拟环境时不停显示语法错误

3

在CentOS 7中成功安装virtualenv后

pip install virtualenv

创建新的虚拟环境时,即使我检查了版本号

virtualenv --version

仍然会显示下面提到的错误。

Traceback (most recent call last):
  File "/usr/bin/virtualenv", line 7, in <module>
    from virtualenv.__main__ import run_with_catch
  File "/usr/lib/python2.7/site-packages/virtualenv/__init__.py", line 3, in <module>
    from .run import cli_run
  File "/usr/lib/python2.7/site-packages/virtualenv/run/__init__.py", line 12, in <module>
    from .plugin.activators import ActivationSelector
  File "/usr/lib/python2.7/site-packages/virtualenv/run/plugin/activators.py", line 6, in <module>
    from .base import ComponentBuilder
  File "/usr/lib/python2.7/site-packages/virtualenv/run/plugin/base.py", line 9, in <module>
    from importlib_metadata import entry_points
  File "/usr/lib/python2.7/site-packages/importlib_metadata/__init__.py", line 9, in <module>
    import zipp
  File "/usr/lib/python2.7/site-packages/zipp.py", line 153
SyntaxError: Non-ASCII character '\xe2' in file /usr/lib/python2.7/site-packages/zipp.py on line 154, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

我尝试卸载并重新安装它,但到目前为止还没有运气。

2个回答

4

您正在使用已经停止维护的Python 2.7版本,而且所用的Virtualenv版本不支持Python 2.7。

建议操作:

  • 停止使用Python 2.7,改用Python 3.x(目前最新版本为3.8)
  • 或安装旧版Virtualenv(例如pip install "virtualenv<20.0"),或者安装适用于您的其他主要版本的Virtualenv

我肯定需要尽快升级。 - mehulJ
StackOverflow说我不能在90分钟内发布下一个问题。正在等待。 - mehulJ
https://stackoverflow.com/questions/60821272/python3-8-virtualenv-pip-not-upgrading - mehulJ
截至2020年5月,Virtualenv 20似乎可以与Python 2.7一起使用,而且更新日志中没有提到放弃对Python 2.7的支持:https://virtualenv.pypa.io/en/stable/changelog.html - fields
@fields 这是在三月份的事情,自那时以来 Virtualenv 可能已经发生了变化。然而,Python 2 仍然已经停止支持。 - AKX
显示剩余2条评论

0
在我的情况下,当运行workon <foo>时,我会得到类似的错误:
xb@dnxb:/tmp$ workon foo
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/xiaobai/.local/lib/python3.6/site-packages/virtualenvwrapper/hook_loader.py", line 16, in <module>
    from stevedore import ExtensionManager
  File "/home/xiaobai/.local/lib/python3.6/site-packages/stevedore/__init__.py", line 11, in <module>
    from .extension import ExtensionManager
  File "/home/xiaobai/.local/lib/python3.6/site-packages/stevedore/extension.py", line 19, in <module>
    from . import _cache
  File "/home/xiaobai/.local/lib/python3.6/site-packages/stevedore/_cache.py", line 31, in <module>
    import importlib_metadata
  File "/home/xiaobai/.local/lib/python3.6/site-packages/importlib_metadata/__init__.py", line 9, in <module>
    import zipp
  File "/home/xiaobai/.local/lib/python3.6/site-packages/zipp.py", line 153
SyntaxError: Non-ASCII character '\xe2' in file /home/xiaobai/.local/lib/python3.6/site-packages/zipp.py on line 154, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
...

错误显示在开头的是 python2.7/runpy.py,但我希望整个过程都使用 python 3。

然后当我执行 source /usr/share/virtualenvwrapper/virtualenvwrapper.sh 时,也出现了相同的错误。

所以我检查了文件,并注意到它基于 which python 命令的结果使用 python 2,在我的系统中 /usr/bin/python 符号链接到 python2.7:

xb@dnxb:/tmp$ grep -n which /usr/share/virtualenvwrapper/virtualenvwrapper.sh
50:    VIRTUALENVWRAPPER_PYTHON="$(command \which python)"
316:    typeset exe_path="$(command \which "$1" | (unset GREP_OPTIONS; command \grep -v "not found"))"
xb@dnxb:/tmp$ which python
/usr/bin/python

所以只需编辑此行,将路径硬编码为/usr/bin/python3(我的python3路径),就不会再出现sourceworkon的错误了:

xb@dnxb:/tmp$ sudo sed -i 's/VIRTUALENVWRAPPER_PYTHON="$(command \\which python)"/VIRTUALENVWRAPPER_PYTHON=\/usr\/bin\/python3/g' /usr/share/virtualenvwrapper/virtualenvwrapper.sh
xb@dnxb:/tmp$ grep -n which /usr/share/virtualenvwrapper/virtualenvwrapper.sh
316:    typeset exe_path="$(command \which "$1" | (unset GREP_OPTIONS; command \grep -v "not found"))"
xb@dnxb:/tmp$ grep -n python3 /usr/share/virtualenvwrapper/virtualenvwrapper.sh
50:    VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
xb@dnxb:/tmp$ workon foo
(foo) xb@dnxb:/tmp$ 

当然,如果你想动态地使用Python 2或3而不编辑此脚本,你可以设置VIRTUALENVWRAPPER_PYTHON环境变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接