诊断类似 Python 安装中 virtualenv 行为的差异

Diagnosing a discrepancy in virtualenv behavior across similar Python installations

我正在比较两个单独的 Ubuntu 16.04 服务器上两个遗留 Python 2.7.12 安装的虚拟环境。

第一个是Ubuntu 16.04.7 LTS,第二个是Ubuntu 16.04.6 LTS

两者都是 运行 虚拟环境中的 Django 项目。

这个问题是关于虚拟环境在上述两个安装中的表现如何不同。我需要了解并弥合这种行为差距。


当我在之前的安装中创建一个虚拟环境时,我看到的输出是:

created virtual environment CPython2.7.12.final.0-64 in 113ms
  creator CPython2Posix(dest=/home/ubuntu/.virtualenvs/test, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, wheel=bundle, setuptools=bundle, via=copy, app_data_dir=/home/ubuntu/.local/share/virtualenv)
    added seed packages: pip==20.3.1, setuptools==44.1.1, wheel==0.36.1
  activators PythonActivator,CShellActivator,FishActivator,PowerShellActivator,BashActivator
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/preactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/postactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/get_env_details

当我在后面的安装中创建一个虚拟环境时,我看到的输出是:

New python executable in /home/ubuntu/.virtualenvs/test/bin/python
Installing setuptools, pip, wheel...
done.
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/preactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/postactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/test/bin/get_env_details

基本上两个输出的前几行是不同的。怎么样?


接下来,在之前的安装中访问~/.virtualenvs/test/lib/python2.7时,看到几个文件:

但是,在后面的安装中访问~/.virtualenvs/test/lib/python2.7时,我看到了更多的文件。具体来说:


我的问题是:

  1. 当底层 Python 版本相同时,为什么两个虚拟环境的初始化不同?
  2. 我想在前一个安装中复制后一个安装的结果。我该如何配置?

我问这个是因为有一个 celery+supervisor 安装可以在后一种环境中完美运行,但在前一种环境中会失败。我需要诊断并修复此故障。

万一重要,失败错误如下:

    load_host_site()
  File "/home/ubuntu/.virtualenvs/app/lib/python2.7/site.py", line 41, in load_host_site
    reload(sys.modules["site"])  # noqa # call system site.py to setup import libraries
  File "/home/ubuntu/.virtualenvs/app/lib/python2.7/site.py", line 164, in <module>
    main()
  File "/home/ubuntu/.virtualenvs/app/lib/python2.7/site.py", line 19, in main
    load_host_site()
  File "/home/ubuntu/.virtualenvs/app/lib/python2.7/site.py", line 52, in load_host_site
    add_site_dir = sys.modules["site"].addsitedir
AttributeError: 'module' object has no attribute 'addsitedir'

两个安装中的 .virtualenvs/app/lib/python2.7/site.py 似乎不同。上面的错误是问题的根源。

区别在于 virtualenv 在版本 16.7.9 之后的改进方式。下一个版本 - Version 20.0.0b1 - 是对包的完全重写。

问题中的环境表现不同,因为前者有 16.7.9,而后者有 20.2.2。恢复到 16.7.9 已经成功。

参考这里https://virtualenv.pypa.io/en/20.0.1/changelog.html#v20-0-0b1-2020-01-28