Virtualenv на WSL создает файлы, отличные от Virtualenv на PowerShell - PullRequest
1 голос
/ 19 октября 2019

У меня установлен WSL в моей системе с запущенным Python 3.7.3, в то время как Python в моей основной системе работает 3.7.4. Обе системы имеют pip (или pip3), установленный вместе с virtualenv 16.xx и выше. Моя проблема в том, что использование virtualenv env в WSL создает структуру папок, отличную от структуры в PowerShell, но проблема не в разных путях, а в файлах, которые создаются в папке lib.

Я попытался переустановить virtualenv на WSL, выполнив pip3 uninstall virtualenv, но проблема все еще сохраняется.

https://imgur.com/a/P8SfXUX Здесь представлены изображения как WSL, так и PowerShell.

Как видите, файлы, созданные WSL, имеют размер 0-1 КБ и не распознаются Windows какв отличие от файлов, созданных PowerShell, которые полностью функционируют.

Может кто-нибудь объяснить мне, почему это происходит? Спасибо.

1 Ответ

1 голос
/ 19 октября 2019

Создание 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 байт. Это потому, что это сам исполняемый двоичный файл, а не скрипт. Он содержит весь код, необходимый для запуска, который был скомпилирован. Поскольку он самодостаточен и не зависит от кода в другом месте файловой структуры, он становится больше.

...