Virtualenv: 微软商店 python 支持

创建于 2019-06-02  ·  26评论  ·  资料来源: pypa/virtualenv

  1. 从 Microsoft Store 安装 Python 3.7
  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这似乎与 pip 相关 🤔 但是当从 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,我的错🤦‍♂

因此,尝试在新创建的 virtualenv 上导入 _socket 失败:

# 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 的 Store 发行版。 我建议在这里向@zooba寻求帮助,因为他是该发行版的专家。

@JoDoX你能做一个简单的测试吗? 启动 Python,然后运行

import _socket
import socket

这应该没有错误。 如果出现错误,则问题出在 Python 中,而不是 virtualenv(或 pip)。

@pfmoore请参阅我上面的帖子。 如果从已安装的 python 启动,这些命令将起作用。 但是,它们在虚拟环境 python 中失败了。 似乎与只有从已安装的 Python 运行才能访问 DLL 的事实有关。 一旦你复制了可执行文件,它似乎就失去了访问上游 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 ,因为我不知道任何关于商店构建如何工作的开发人员级别的文档,而且我对代码也不够熟悉,无法深入研究它。

是的,你不能复制可执行文件。 一旦它在应用程序包之外,它的上下文就不会被操作系统正确激活。

您可以对其进行符号链接,也可以复制python.exe venv/scripts/nt 。 它是 py.exe 启动器的特殊副本,它将查找pyvenv.cfg以找到要启动的实际启动器。 (或者,如果您不想使用该文件,您可以构建它的另一个版本来查找您的首选配置设置。)

一旦它在应用程序包之外,它的上下文就不会被操作系统正确激活。

有点离题,但是您能否指出使这种情况成为这种情况的代码(和/或相关的MS文档)? 我想比现在更好地了解商店应用程序(目前我基本上对 MS Store 应用程序一无所知),所以我不必一直在这些东西上找你 ;-)

我不确定这部分是否已记录在案,如果是,它可能会深入MSIX 文档或可能在某些 AppV 规范中,如果你能找到的话(这是使用的隔离技术的旧版本) .

这些包主要用作应用程序,这意味着单个入口点(并防止其他应用程序使用我们的 DLL)。 因此,在我们确认我们属于该包之前,我们不能在包中使用LoadLibrary文件,并且在一般情况下,唯一的方法是启动原始的python.exe

哦,需要明确的是,这些都是故意的、按设计的操作系统限制。 Python 没有选择让这一切发生,因此 CPython 中没有代码。 尽管隐藏在VENV_REDIRECT定义后面的launcher.c的部分可能很有趣(并且不受支持,内部细节......)

谢谢。 我做了一些简短的挖掘, https://docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes看起来可能是相关的(虽然我没有阅读它,我主要发布这个,所以我可以稍后再次找到链接;-))

@gaborbernat我怀疑 virtualenv 支持商店 Python 的“正确”方式是从venv/scripts/nt复制重定向器,正如@zooba 所建议的那样。 但这与使用 venv 进行环境创建的想法非常接近,这是我不久前提出的,由于兼容性问题,您并不热衷于此。 我怀疑如果我们为 Store 应用程序这样做会更糟,而不是为具有相同版本的“标准”Python。 (另外,我不确定将重定向器与 virtualenv 的自定义site.py之类的东西混合是否会起作用)。

我很乐意在编码方面提供帮助,但我需要您就您想要采取的方法提供指导。

(哦,还有@zooba ,虽然我引起了你的注意,但商店 Python 与“正常”Python 安装的共存情况如何?如果我想测试这些东西,我会更好地使用干净的 VM,以避免干扰使用我的主要 Python 安装?或者我可以安装和卸载商店 Python 而没有副作用?)

所以我很好地考虑了这一点。 最后,我认为将核心逻辑切换为:

  • 如果可能的话,使用 stdlib 提供的 venv 创建 venv,修补 stdlib 创建的 venv 以提供我们自己的相同保证,
  • 否则,使用我们自己的逻辑。

一些提供 stdlib 的地方可能不存在 venv:

  • 蟒蛇2,
  • venv 单独打包且目前未安装的发行版(例如 ubuntu python3.7-venv)。 @pfmoore教过吗? 我们需要拿出一份我们目前提供的保证清单来实现这一点。

我会对此表示强烈的+1。 随着 Python 2 很快到达 EOL,我们将处于基本上所有受支持的 Python 版本都具有 venv 的情况(而那些不支持的版本仍然具有机制 - pyvenv.cfg )。 因此,如果我们能够尽可能地避免我们目前使用的 hack,那将是一个巨大的胜利(而且它也将使 virtualenv 和 venv 之间的兼容性成为非问题 :-))

困难的部分是决定什么构成我们提供的保证清单。 我实际上不确定有很多 - 唯一困难的是sys.real_prefixsys.base_prefix问题,老实说,我相信无论如何我们都应该遵循标准库(使用适当的过渡期)。

我同意@pfmoore的观点。

需要明确的是,至少在未来 3 年内不会放弃对 Python 2 的支持。 新的解决方案只会在可能的情况下更喜欢使用 stdlib venv ,否则会回退到内置逻辑。

明白了。 现有的过程需要保留,以便支持 Python 2,但如果我们可以在核心 venv可用的地方避免它,那就太好了。

(哦,还有@zooba ,虽然我引起了你的注意,但商店 Python 与“正常”Python 安装的共存情况如何?如果我想测试这些东西,我会更好地使用干净的 VM,以避免干扰使用我的主要 Python 安装?或者我可以安装和卸载商店 Python 而没有副作用?)

抱歉,我错过了这个, @pfmoore (Github 通知并不总是引起我的注意......)。

您可以安装/卸载商店 Python 而不会产生副作用 - 这实际上是它最大的功能之一。 (虽然这样做的缺点是它无法更新真实的用户注册表,因此 PEP 514 还不够,因为覆盖值会破坏干净的安装/卸载周期。)

我认为我们在 Twitter 上讨论过,如果根据 pep 514 我们使用不同的公司(例如 Microsoft Store)而不是 PythonCore,则不会是覆盖问题。 然后我们只需要更新 py.exe 来接受它。

使用 venv 而不是 virtualenv 为我解决了这个问题

旧的 virtualenv 不能也不会支持这一点。 virtualenv 20,重写,应该。 我们需要验证,遗憾的是,AFAIK 无法将商店 python 添加到 Azure CI。 @zooba你能确认这仍然是这种情况,并且会继续吗?

在第一次迭代中,我们可以只标记 builtin/self-do 方法不支持 store; 检查 python 是否存储 pyhton @zooba建议:

您可能想尝试打开 sys.executable 进行阅读,因为我认为这是您最大的问题(它会失败)
或者您可以检查 pythonXY.dll 是否与 sys.executable 不在同一目录中,我认为这是您需要修复的另一个假设
这可能以几种不同的方式发生(嵌入、冻结、静态构建),我怀疑 virtualenv 现在不能与它们中的任何一个一起使用
虽然旧的(3.5 之前的)安装程序可以将它放入系统文件夹中,但它仍然可以工作,所以不是一个完美的测试。

这现在已作为#1502 的一部分实现。 Virtualenv 将正确地将 store python 标记为与其内置策略不兼容,并回退以将任务委托给 store python 的 venv 模块。 该项目的测试套件通过。 此外,如果 Windows 操作系统支持,现在我们将使用符号链接而不是复制方法(我们通过尝试在临时文件夹中创建符号链接来测试这一点)。

virtualenv 中对 Microsoft Store 的内置支持可能会在未来的后续工单中完成,可能通过改进我们的 cpython3windows 类来使用所需的新技术。

此页面是否有帮助?
0 / 5 - 0 等级