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>
@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 без побочных эффектов?)
Так что я хорошо подумал. В конце концов, я думаю, имеет смысл переключить основную логику на:
Несколько мест, где предоставленная stdlib может отсутствовать venv:
Я был бы сильным +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 для использования новых методов, необходимых для этого.