Создание virtualenv в Windows Subsystem for Linux создаст virtualenv, который предназначен для работы в Linux, а не в Windows. Вот почему файлы, созданные virtualenv в WSL, не распознаются Windows (а файлы, созданные virtualenv в Powershell, не будут использоваться в 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. Это нормально, и это не проблема.
Причина в том, что большая часть файла в virtualenvs для Linux является сценариями, а не двоичными файлами. Сценарии - это файлы с кодом, которые будут запускаться интерпретатором, тогда как двоичные файлы представляют собой скомпилированный код, который будет либо запускаться напрямую (например, .exe
файлы), либо использоваться в качестве библиотеки (например, .dll
файлы).
На Windows virtualenv, activate
, activate.bat
, activate.ps1
. activate_this.py
, activate.xsh
и deactivate.bat
являются сценариями. Вы можете видеть, что их размер колеблется от 0,6 до 2,3 кБ, что довольно мало. easy_install-3.7.exe
, easy_install.exe
, f2py.exe
, pip3.7.exe
, pip3.exe
, pip.exe
, python.exe
, pythonw.exe
и wheel.exe
, с другой стороны, являются двоичными исполняемыми файлами. Вы можете видеть, что они находятся в диапазоне от 98 до 103 кБ, что намного больше, чем сценарии. python37.dll
и python3.dll
- это библиотечные файлы, которые также являются скомпилированными двоичными файлами, но не исполняемыми напрямую, и они также достаточно велики. python3.dll
намного меньше, чем python37.dll
, поэтому python3.dll
, вероятно, просто ссылается на python37.dll
, но даже в этом случае python3.dll
все еще очень велик по сравнению со сценариями.
В Linux virtualenv, нас другой стороны, все файлы являются сценариями, кроме python
, python3
и python3.6
. python3
- это двоичный исполняемый файл, а python
и python3.6
являются просто символическими ссылками на python3
.
Причина, по которой скрипты обычно меньше, заключается в том, что они выполняют код, который на самом деле находится в интерпретаторе без включенияэтот код в самом файле. В качестве примера давайте рассмотрим pip
.
Вот содержимое файла pip
в Linux virtualenv:
#!/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, который запускается винтерпретатор Python Virtualenv. Он импортирует модуль pip, который содержится в другом месте структуры virtualenv, а затем запускает метод main после некоторого анализа аргументов командной строки.
Фактический код для pip
находится где-то еще, ифактический выполняемый исполняемый файл - python3
, который затем запускает этот скрипт в интерпретаторе. Вот почему размер файла составляет всего 246 байт.
pip.exe
в Windows virtualenv, с другой стороны, составляет 102 765 байт. Это потому, что это сам исполняемый двоичный файл, а не скрипт. Он содержит весь код, необходимый для запуска, который был скомпилирован. Поскольку он самодостаточен и не зависит от кода в другом месте файловой структуры, он становится больше.