python - WSL 上的 Virtualenv 创建的文件与 PowerShell 上的 Virtualenv 不同

标签 python pip virtualenv windows-subsystem-for-linux virtual-environment

我的系统上安装了 WSL,运行的是 Python 3.7.3,而主系统上的 Python 运行的是 3.7.4。两个系统都安装了 pip(或 pip3)以及 virtualenv 16.x.x 及更高版本。我的问题是,在 WSL 上使用 virtualenv env 会创建与 PowerShell 上不同的文件夹结构,但问题不在于不同的路径,而在于 lib 文件夹中创建的文件。

我尝试通过执行 pip3 uninstall virtualenv 在 WSL 上重新安装 virtualenv,但问题仍然存在。

/image/lplqz.jpg以下是 WSL 和 PowerShell 的图片。

如您所见,WSL 创建的文件大小为 0-1KB,Windows 无法识别,而 PowerShell 创建的文件功能齐全。

有人可以向我解释一下为什么会发生这种情况吗?谢谢。

最佳答案

在适用于 Linux 的 Windows 子系统中创建 virtualenv 将创建一个在 Linux 上运行的 virtualenv,而不是在 Windows 上运行。这就是为什么 Windows 无法识别 WSL 上的 virtualenv 创建的文件(并且 Powershell 上的 virtualenv 创建的文件将无法在 WSL 中使用)。

至于为什么 Windows virtualenv 中的文件如此之大,是因为它们更多是编译后的二进制文件和库文件,而不是脚本。

我的双引导机器上有两个 virtualenv,因此我们可以查看它们以进行等效比较。 (一个是Python 3.6,一个是Python3.7,但这并不是太重要。)

以下是 Windows virtualenv 的文件:

   2315 activate*
   1067 activate.bat*
   1755 activate.ps1*
   1517 ativate_this.py*
   1159 activate.xsh*
    603 deactivate.bat*
 102783 easy_install-3.7.exe*
 102783 easy_install.exe*
 103281 f2py.exe*
 102765 pip3.7.exe*
 102765 pip3.exe*
 102765 pip.exe*
3748368 python37.dll*
  58896 python3.dll*
  99856 python.exe*
  98320 pythonw.exe*
 102761 wheel.exe*

以下是 Linux virtualenv 的文件:

   2219 activate
   1438 activate.csh
   3103 activate.fish
   1751 activate.ps1
   1517 activate_this.py
   1160 activate.xsh
    259 easy_install*
    259 easy_install-3.6*
    242 f2py*
    242 f2py3*
    242 f2py3.6*
    150 get_env_details*
    246 pip*
    246 pip3*
    246 pip3.6*
     72 postactivate
     74 postdeactivate
     69 preactivate*
     75 predeactivate
      7 python -> python3*
4526456 python3*
      7 python3.6 -> python3*
   2348 python-config*
    237 wheel*

正如您所注意到的,Linux virtualenv 的文件比 Windows 的文件小很多。这是正常现象,不是问题。

原因是 Linux virtualenv 中的文件更多是脚本,而不是二进制文件。脚本是包含将由解释器运行的代码的文件,而二进制文件是编译后的代码,可以直接运行(如 .exe 文件)或用作库(如 .exe)。 dll 文件)。

在 Windows virtualenv 上,activateactivate.batactivate.ps1activate_this.pyactivate.xshdeactivate.bat 是脚本。您可以看到它们的大小范围为 0.6 到 2.3 kB,相当小。 easy_install-3.7.exeeasy_install.exef2py.exepip3.7.exepip3.exepip.exepython.exepythonw.exewheel.exe<另一方面, 都是二进制可执行文件。您可以看到它们的范围从 98 到 103 kB,这比脚本大得多。 python37.dllpython3.dll是库文件,也是编译好的二进制文件,但不能直接执行,而且也比较大。 python3.dllpython37.dll 小得多,因此 python3.dll 可能只是引用 python37.dll,但即便如此,与脚本相比,python3.dll 仍然非常大。

另一方面,在 Linux virtualenv 上,除了 pythonpython3python3.6 之外,所有文件都是脚本。 python3 是一个二进制可执行文件,pythonpython3.6 只是 python3 的符号链接(symbolic link)。

脚本通常较小的原因是它们运行实际上在解释器中的代码,而不在文件本身中包含该代码。作为示例,让我们看一下 pip

以下是 Linux virtualenv 上的文件 pip 的内容:

#!/home/nog642/.virtualenvs/virtualenv-name/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal.main import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

这是一个 python 脚本,在 virtualenv 的 python 解释器中运行。它导入 pip 模块,该模块包含在 virtualenv 结构的其他位置,然后在对命令行参数进行一些解析后运行 main 方法。

pip 的实际代码在其他地方,实际运行的可执行文件是 python3,然后它在解释器中运行此脚本。这就是文件最终只有 246 字节的原因。

另一方面,Windows virtualenv 中的

pip.exe 为 102,765 字节。这是因为它本身是可执行二进制文件,而不是脚本。它包含运行所需的所有代码,并且已编译。由于它是独立的,并且不依赖于文件结构中其他位置的代码,因此它最终会变得更大。

关于python - WSL 上的 Virtualenv 创建的文件与 PowerShell 上的 Virtualenv 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58460221/

相关文章:

python - 使用 ArcGIS 安装的 Python 2.7 安装 pip

python - 无法在virtualenv中使用pip安装html包

python - 在计算机之间迁移 virtualenv 和 Github

python - 写一份 list 以取得优异成绩

python - 从 OpenCV Python 中 ORB 生成的关键点中提取像素值

python - 如何将 Python 代码保持在 80 个字符以下而不使其变得丑陋?

python - 在 Heroku 中安装 Python 依赖项

python - 如果项目出现不止一次,则删除列表中所有出现的项目

python - 使用 pip 与 apt-get 安装软件包有什么区别?

python - 在 Mac OS 上使用 virtualenvwrapper 在 python 版本之间切换