Virtualenv: поддержка питона в магазине майкрософт

Созданный на 2 июн. 2019  ·  26Комментарии  ·  Источник: pypa/virtualenv

  1. Установите Python 3.7 из магазина Microsoft.
  2. получить ошибку при попытке создать новый virtualenv
Microsoft Windows [Version 10.0.18908.1000]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\jodox>mkdir \temp\example

C:\Users\jodox>cd \temp\example

C:\temp\example>virtualenv .virtualenv
Using base prefix 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0'
New python executable in C:\temp\example\.virtualenv\Scripts\python.exe
Command C:\temp\example\.vir...v\Scripts\python.exe -m pip config list had error code 1
Installing setuptools, pip, wheel...

  Complete output from command C:\temp\example\.vir...v\Scripts\python.exe - setuptools pip wheel:
  Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_internal\__init__.py", line 19, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\__init__.py", line 8, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\connectionpool.py", line 7, in <module>
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\socket.py", line 49, in <module>
    import _socket
ImportError: DLL load failed: Access is denied.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 13, in <module>
ImportError: cannot import name 'main' from 'pip' (C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\__init__.py)
----------------------------------------
...Installing setuptools, pip, wheel...done.
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\Scripts\virtualenv.exe\__main__.py", line 9, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 831, in main
    symlink=options.symlink,
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 1123, in create_environment
    install_wheel(to_install, py_executable, search_dirs, download=download)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 973, in install_wheel
    _install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 1060, in _install_wheel_with_search_dir
    call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 924, in call_subprocess
    raise OSError("Command {} failed with error code {}".format(cmd_desc, proc.returncode))
OSError: Command C:\temp\example\.vir...v\Scripts\python.exe - setuptools pip wheel failed with error code 1

C:\temp\example>pip list
Package          Version
---------------- ----------
certifi          2019.3.9
pipenv           2018.11.26
virtualenv       16.6.0
virtualenv-clone 0.5.3

C:\temp\example>
enhancement

Все 26 Комментарий

@zooba похоже на плохую упаковку в магазине Windows 🤔?

@gaborbernat Я думаю, ошибка в virtualenv, потому что модуль venv работает нормально

Microsoft Windows [Version 10.0.18908.1000]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\jodox>cd \temp\example

(.venv) C:\temp\example>python3 -m venv .venv

C:\temp\example>.\.venv\Scripts\activate.bat

(.venv) C:\temp\example>python -V
Python 3.7.3

(.venv) C:\temp\example>python -c "import sys;print(sys.executable)"
C:\temp\example\.venv\Scripts\python.exe

(.venv) C:\temp\example>python -c "import socket"

(.venv) C:\temp\example>

Не совсем человек. venv обеспечивает созданный venv всем, что вы связали. Здесь не удается импортировать сетевой стек (что делает virtualenv для установки последних pip/setuptools). Передайте --no-download, и virtualenv также должен работать.

@gaborbernat Мне не нужен virtualenv, но его использует pipenv , и у меня нет возможности передавать аргументы

C:\temp\example>pipenv --help
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
  --where             Output project home information.
  --venv              Output virtualenv information.
  --py                Output Python interpreter information.
  --envs              Output Environment Variable options.
  --rm                Remove the virtualenv.
  --bare              Minimal output.
  --completion        Output completion (to be eval'd).
  --man               Display manpage.
  --support           Output diagnostic information for use in GitHub issues.
  --site-packages     Enable site-packages for the virtualenv.  [env var:
                      PIPENV_SITE_PACKAGES]
  --python TEXT       Specify which version of Python virtualenv should use.
  --three / --two     Use Python 3/2 when creating virtualenv.
  --clear             Clears caches (pipenv, pip, and pip-tools).  [env var:
                      PIPENV_CLEAR]
  -v, --verbose       Verbose mode.
  --pypi-mirror TEXT  Specify a PyPI mirror.
  --version           Show the version and exit.
  -h, --help          Show this message and exit.


Usage Examples:
   Create a new project using Python 3.7, specifically:
   $ pipenv --python 3.7

   Remove project virtualenv (inferred from current directory):
   $ pipenv --rm

   Install all dependencies for a project (including dev):
   $ pipenv install --dev

   Create a lockfile containing pre-releases:
   $ pipenv lock --pre

   Show a graph of your installed dependencies:
   $ pipenv graph

   Check your installed dependencies for security vulnerabilities:
   $ pipenv check

   Install a local setup.py into your virtual environment/Pipfile:
   $ pipenv install -e .

   Use a lower-level pip command:
   $ pipenv run pip freeze

Commands:
  check      Checks for security vulnerabilities and against PEP 508 markers
             provided in Pipfile.
  clean      Uninstalls all packages not specified in Pipfile.lock.
  graph      Displays currently-installed dependency graph information.
  install    Installs provided packages and adds them to Pipfile, or (if no
             packages are given), installs all packages from Pipfile.
  lock       Generates Pipfile.lock.
  open       View a given module in your editor.
  run        Spawns a command installed into the virtualenv.
  shell      Spawns a shell within the virtualenv.
  sync       Installs all packages specified in Pipfile.lock.
  uninstall  Un-installs a provided package and removes it from Pipfile.
  update     Runs lock, then sync.


C:\temp\example>pipenv install
Creating a virtualenv for this project…
Pipfile: C:\temp\example\Pipfile
Using C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\python.exe (3.7.3) to create virtualenv…
[==  ] Creating virtual environment...Already using interpreter C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\python.exe
Using base prefix 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0'
New python executable in C:\Users\jodox\.virtualenvs\example-Q6QloNNM\Scripts\python.exe
Command C:\Users\jodox\.virt...M\Scripts\python.exe -m pip config list had error code 1
Installing setuptools, pip, wheel...

  Complete output from command C:\Users\jodox\.virt...M\Scripts\python.exe - setuptools pip wheel:
  Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_internal\__init__.py", line 19, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\__init__.py", line 8, in <module>
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\connectionpool.py", line 7, in <module>
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\socket.py", line 49, in <module>
    import _socket
ImportError: DLL load failed: Access is denied.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 13, in <module>
ImportError: cannot import name 'main' from 'pip' (C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\__init__.py)
----------------------------------------
...Installing setuptools, pip, wheel...done.

Failed creating virtual environment
[pipenv.exceptions.VirtualenvCreationException]:   File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pipenv\cli\command.py", line 254, in install
[pipenv.exceptions.VirtualenvCreationException]:       editable_packages=state.installstate.editables,
[pipenv.exceptions.VirtualenvCreationException]:   File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pipenv\core.py", line 1741, in do_install
[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,
[pipenv.exceptions.VirtualenvCreationException]:   File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pipenv\core.py", line 574, in ensure_project
[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,
[pipenv.exceptions.VirtualenvCreationException]:   File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pipenv\core.py", line 506, in ensure_virtualenv
[pipenv.exceptions.VirtualenvCreationException]:       python=python, site_packages=site_packages, pypi_mirror=pypi_mirror
[pipenv.exceptions.VirtualenvCreationException]:   File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pipenv\core.py", line 935, in do_create_virtualenv
[pipenv.exceptions.VirtualenvCreationException]:       extra=[crayons.blue("{0}".format(c.err)),]
[pipenv.exceptions.VirtualenvCreationException]: Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 2580, in <module>
    main()
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 831, in main
    symlink=options.symlink,
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 1123, in create_environment
    install_wheel(to_install, py_executable, search_dirs, download=download)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 973, in install_wheel
    _install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 1060, in _install_wheel_with_search_dir
    call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
  File "C:\Users\jodox\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv.py", line 924, in call_subprocess
    raise OSError("Command {} failed with error code {}".format(cmd_desc, proc.returncode))
OSError: Command C:\Users\jodox\.virt...M\Scripts\python.exe - setuptools pip wheel failed with error code 1

Failed to create virtual environment.

C:\temp\example>

Это по-прежнему сводится к проблеме с упаковкой ядра, поскольку _socket не импортируется 🤔 Однако это нужно будет проверить.

@pfmoore это кажется связанным с пипом 🤔, но странно проявляется при вызове из virtualenv путем помещения колеса на путь python 👍

Command C:\Users\traveler\gi...v\Scripts\python.exe -m pip config list had error code 1
Installing setuptools, pip, wheel...

  Complete output from command C:\Users\traveler\gi...v\Scripts\python.exe - setuptools pip wheel:
  Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "C:\Users\traveler\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_internal\__init__.py", line 19, in <module>
  File "C:\Users\traveler\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\__init__.py", line 8, in <module>
  File "C:\Users\traveler\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\virtualenv_support\pip-19.1.1-py2.py3-none-any.whl\pip\_vendor\urllib3\connectionpool.py", line 7, in <module>
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\socket.py", line 49, in <module>
    import _socket
ImportError: DLL load failed: Access is denied.

Редактировать: NM, кажется, у нашего нового virtualenv нет доступа к _socket, мой плохой 🤦‍♂

Поэтому попытка импортировать _socket на только что созданный virtualenv не удалась:

# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\_socket.cp37-win_amd64.pyd
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\_socket.pyd
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\_socket.py
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\_socket.pyw
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\Lib\_socket.pyc
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\_socket.cp37-win_amd64.pyd
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\_socket.pyd
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 670, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 583, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 1043, in create_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed: Access is denied.

Делая то же самое из установленного python

Я никогда не использовал дистрибутив Python из магазина. Я бы посоветовал обратиться за помощью к @zooba , так как он эксперт по этому дистрибутиву.

@JoDoX Можешь провести простой тест? Запустите Python и запустите

import _socket
import socket

Это должно работать без ошибок. Если вы получаете ошибку, значит, проблема связана с чем-то в Python, а не с virtualenv (или pip).

@pfmoore см. мой пост выше. Эти команды работают, если запустить их из установленного python. Однако они выходят из строя из виртуальной среды python. Кажется, это как-то связано с тем фактом, что доступ к библиотекам DLL возможен только при запуске из установленного Python. Как только вы скопируете исполняемый файл, он, похоже, потеряет возможность доступа к восходящим библиотекам DLL. Не уверен, что проблема связана с virtualenv или упаковкой магазина Windows.

Редактировать:

Создание venv и просмотр журнала запуска показывает, что venvs действительно пытаются загрузить pyd из исходного местоположения. Он фактически загружает все из исходного местоположения. Оба Include и Lib пусты. В virtualenv мы пока скопируем их... Может быть, есть лучший способ создать venvs, чем то, что у нас есть сейчас 🤔 Нужно будет изучить.

# C:\Users\traveler\git\venv\lib\encodings\__pycache__\__init__.cpython-37.pyc matches C:\Users\traveler\git\venv\lib\encodings\__init__.py
# code object from 'C:\\Users\\traveler\\git\\venv\\lib\\encodings\\__pycache__\\__init__.cpython-37.pyc'
# trying C:\Users\traveler\git\venv\lib\codecs.cp37-win_amd64.pyd
# trying C:\Users\traveler\git\venv\lib\codecs.pyd
# trying C:\Users\traveler\git\venv\lib\codecs.py
# C:\Users\traveler\git\venv\lib\__pycache__\codecs.cpython-37.pyc matches C:\Users\traveler\git\venv\lib\codecs.py
# code object from 'C:\\Users\\traveler\\git\\venv\\lib\\__pycache__\\codecs.cpython-37.pyc'

против

# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\encodings.cp37-win_amd64.pyd
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\encodings.pyd
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\encodings.py
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\encodings.pyw
# trying C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\DLLs\encodings.pyc
# C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.1008.0_x64__qbz5n2kfra8p0\lib\encodings\__pycache__\__init__.

@gaborbernat А, извините, я просмотрел ваш пост и неправильно понял, что вы сказали. Виноват.

Я, конечно, не исключаю, что копирование исполняемого файла Python может вызвать проблемы. Нам действительно нужен @zooba здесь, так как я не знаю никаких документов уровня разработчика о том, как работает сборка Store, и я недостаточно знаком с кодом, чтобы углубляться в него.

Да, вы не можете скопировать исполняемый файл. Как только он окажется за пределами пакета приложения, его контекст не будет должным образом активирован операционной системой.

Вы можете либо создать символическую ссылку, либо скопировать python.exe из venv/scripts/nt . Это специальная копия программы запуска py.exe, которая будет искать pyvenv.cfg , чтобы найти фактическую программу для запуска. (Или, если вы не хотите использовать этот файл, вы можете создать другую его версию, которая ищет предпочтительные параметры конфигурации.)

Как только он окажется за пределами пакета приложения, его контекст не будет должным образом активирован операционной системой.

Несколько оффтоп, но можете ли вы указать мне код, который делает это так (и/или соответствующие документы MS по этому поводу)? Я хотел бы понимать приложение магазина лучше, чем сейчас (я в принципе ничего не понимаю в приложениях MS Store на данный момент), поэтому мне не нужно постоянно пинговать вас по этому поводу ;-)

Я не уверен, что эта часть даже задокументирована, и если это так, она, вероятно, будет глубоко внутри документов MSIX или, возможно, в некоторых спецификациях AppV, если вы сможете найти это (это более старая версия используемой технологии изоляции) .

Пакеты предназначены для использования в первую очередь как приложения, что означает единую точку входа (и предотвращение использования наших DLL другими приложениями). Таким образом, мы не можем LoadLibrary файлов в пакете, пока не убедимся, что мы принадлежим пакету, и в общем случае единственный способ сделать это — запустить оригинальный python.exe .

О, и, чтобы быть ясным, все это преднамеренные ограничения ОС. Python не хотел, чтобы это произошло, поэтому в CPython нет кода для этого. Хотя части файла launcher.c, скрытые за определением VENV_REDIRECT , могут быть интересными (и неподдерживаемые внутренние детали...)

Спасибо. Я немного покопался, и https://docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scene выглядит так, как будто это может быть актуально (хотя я не прочитайте это еще раз, я в основном публикую это, чтобы позже снова найти ссылку ;-))

@gaborbernat Я подозреваю, что «правильный» способ для virtualenv поддерживать хранилище Python будет состоять в том, чтобы скопировать редиректор из venv/scripts/nt , как предложил @zooba . Но это очень близко к идее использования venv для создания среды, которую я предложил некоторое время назад, и вы не были в восторге из-за последствий совместимости. Подозреваю, что было бы еще хуже, если бы мы делали это для приложения Store, а не «стандартного» Python той же версии. (Кроме того, я не уверен, что смешивание редиректора с такими вещами, как пользовательский site.py в virtualenv, вообще сработает).

Я буду рад помочь с кодированием, но мне понадобится ваше руководство по подходу, который вы хотите использовать.

(О, и @zooba , пока я обращаю ваше внимание, насколько хорошо Python в магазине сосуществует с «обычной» установкой Python? Если я хочу протестировать этот материал, будет ли мне лучше использовать чистую виртуальную машину, чтобы не мешать? с моей основной установкой Python? Или я могу установить и удалить магазин Python без побочных эффектов?)

Так что я хорошо подумал. В конце концов, я думаю, имеет смысл переключить основную логику на:

  • если возможно, создайте venv с предоставленной stdlib venv, исправьте stdlib created venv, чтобы предложить те же гарантии, что и наши собственные,
  • в противном случае используйте нашу собственную логику.

Несколько мест, где предоставленная stdlib может отсутствовать venv:

  • питон 2,
  • дистрибутивы, в которых venv упакован отдельно и не установлен в данный момент (например, ubuntu python3.7-venv). @pfmoore научил? Нам нужно составить список гарантий, которые мы предлагаем на данный момент, чтобы реализовать это.

Я был бы сильным +1 в этом. Поскольку Python 2 очень скоро достигнет EOL, мы окажемся в ситуации, когда практически все поддерживаемые версии Python имеют venv (а те, которые не имеют, все еще имеют механизмы — pyvenv.cfg ). Так что, если мы сможем избежать хаков, которые мы используем в настоящее время, насколько это возможно, это будет огромная победа (и это также сделает совместимость между virtualenv и venv не проблемой :-))

Трудная часть - решить, что составляет список гарантий, которые мы предлагаем. На самом деле я не уверен, что их много — единственная трудность — это проблема sys.real_prefix против sys.base_prefix , и, честно говоря, я считаю, что мы должны в любом случае следовать стандарту stdlib (с подходящий переходный период).

Я согласен с @pfmoore в этом.

Просто для ясности: поддержку Python 2 не планируется прекращать по крайней мере в течение следующих 3 лет. Новое решение просто предпочтет использовать stdlib venv, где это возможно, и откат к встроенной логике в противном случае.

Понял. Существующий процесс должен оставаться таким, чтобы поддерживался Python 2, но если мы сможем избежать его там, где доступен основной venv, это здорово.

Начал отдельное обсуждение в https://github.com/pypa/virtualenv/issues/1366 👍

(О, и @zooba , пока я обращаю ваше внимание, насколько хорошо Python в магазине сосуществует с «обычной» установкой Python? Если я хочу протестировать этот материал, будет ли мне лучше использовать чистую виртуальную машину, чтобы не мешать? с моей основной установкой Python? Или я могу установить и удалить магазин Python без побочных эффектов?)

Извините, я пропустил это, @pfmoore (уведомления Github не всегда привлекают мое внимание...).

Вы можете установить/удалить магазин Python без побочных эффектов — на самом деле это одна из его самых больших функций. (Хотя недостатком этого является то, что он не может обновить реальный реестр пользователей, поэтому PEP 514 недостаточно, поскольку перезапись значений нарушит цикл чистой установки/удаления.)

Я думаю, мы обсуждали в Твиттере, что не будет проблемы перезаписи, если в соответствии с pep 514 мы будем использовать другую компанию (например, Microsoft Store) вместо PythonCore. И затем нам просто нужно обновить py.exe, чтобы он тоже принял это.

использование venv вместо virtualenv решает проблему для меня

Старый virtualenv не может и не будет поддерживать это. virtualenv 20, переписанный, должен. Нам нужно проверить, к сожалению, насколько мне известно, невозможно добавить хранилище python в Azure CI. @zooba , можете ли вы подтвердить, что это все еще так и будет продолжаться?

В первой итерации мы можем просто отметить, что встроенный/самостоятельный метод не поддерживает хранилище; чтобы проверить, хранится ли питон, предложил pyhton @zooba :

Вы, вероятно, захотите попробовать открыть sys.executable для чтения, так как я думаю, что это ваша самая большая проблема (это не удастся)
Или вы можете проверить, не находится ли pythonXY.dll в том же каталоге, что и sys.executable, что, я думаю, является еще одним предположением, которое вам нужно исправить.
Это может произойти несколькими способами (встраивание, замораживание, статическая сборка), и я подозреваю, что virtualenv не будет работать ни с одним из них прямо сейчас.
Хотя старые (до 3.5) установщики могли поместить его в системную папку, что все равно будет работать, так что это не идеальный тест.

Теперь это было достигнуто в рамках # 1502. Virtualenv правильно пометит Python магазина как несовместимый с его встроенной стратегией и отступит, чтобы делегировать задачу модулю venv Python Store. Тестовый набор проекта проходит. Кроме того, теперь мы будем использовать символическую ссылку вместо метода копирования, если ОС Windows поддерживает его (мы проверяем это, пытаясь создать символическую ссылку внутри временной папки).

Встроенная поддержка Microsoft Store в virtualenv может быть реализована в следующем тикете, вероятно, путем улучшения нашего класса cpython3windows для использования новых методов, необходимых для этого.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги