Virtualenv: 产生了数百个进程

创建于 2019-07-09  ·  31评论  ·  资料来源: pypa/virtualenv

安装 python 3.7.4 64 位后,我尝试在文件夹中启动虚拟环境。 但是,启动了大约一千个 python 进程,虚拟环境没有完成。

操作系统:Windows 10 家庭版
代码在 Cygwin 64 位中运行

失败代码:

mkdir test
cd test
virtualenv venv

pip list

套餐版本


小行星2.2.0
颜色 0.4.1
分类 4.3.9
惰性对象代理 1.3.1
麦凯布 0.6.1
点 19.1.1
pylint 2.3.0
绳索 0.14.0
设置工具 40.8.0
六 1.12.0
类型为 1.3.1
虚拟环境 16.6.1
包装 1.11.1

最有用的评论

维护者在这里。 正如我上面所说,CPython 的某些内部变量的契约发生了变化,这导致了 python 3.7 和 3.8 进程创建的无限循环。

所有31条评论

我今天第一次尝试安装python、pip和virtualenv,遇到了同样的问题。

我已经通过评论 3 行来修复它
Python\Python37\Lib\site-packages\virtualenv.py
并添加
-p python
运行 virtualenv 时

我评论的行是 783-785:
if hasattr(sys, "_base_executable"):
print("hasattr(sys, \"_base_executable\") == yes")
return sys._base_executable

@AndrYast激活环境后你还在 3.7.4 上吗? 这绝对似乎是昨天(7/8/19)发布的 3.7.4 的一个问题。

@thingselliotprograms是的,正在运行
venv\Scripts\activate
python --version
给我
Python 3.7.4

自从昨天将 python 升级到 3.7.4 以来,pipenv 挂起遇到了同样的问题。 与 virtualenv 相关的潜在问题。 暂时将 python 降级到 3.7.3。

Ack virtualenv latest 被破坏,因为https://github.com/python/cpython/pull/14428总是设置sys._base_executable

我在 3.7.4 中遇到了同样的问题。 我正在使用pipenv并得到一个[WinError 8] Not enough memory resources are available to process this command 。 我无法创建任何 virtualenv。 在 3.7.3 中一切正常。

我在 3.7.4 中也遇到了这个确切的问题。

python.exe进程的滚滚雷霆耗尽内存,virtualenv创建最终失败。

3.7.2 不存在此问题。

维护者在这里。 正如我上面所说,CPython 的某些内部变量的契约发生了变化,这导致了 python 3.7 和 3.8 进程创建的无限循环。

不知道这是否是一个_好_主意,但我能够通过这个快速的 hack 创建一个虚拟环境。

# virtualenv.py:783
if hasattr(sys, "_base_executable") and sys.version_info < (3, 7, 4):
    return sys._base_executable

从该行上方的评论来看,您似乎在早期版本中玩得很开心。

也许需要额外检查sys._base_executable != sys.executable 。 但老实说,我不知道 - 这似乎在补丁版本中不断变化,我没有时间跟上正在发生的事情(这一切似乎都与支持“Windows Store”构建的工作有关的 Python)。

也许@zooba可以在这里发表评论或提供建议。 我们使用无证内部,所以最终的问题是我们来的地址,但我不知道支持的方式来获得我们需要的信息,所以我不认为这会不会受到解决方案每次我们获得新版本的 Python 时都可能会损坏:-(

最终,#1377 可能是这里唯一可靠的解决方案。

我想只要我们加上那张支票,我们就会没事的。

运行 Windows 并尝试创建 virtualenv 的 Travis CI 作业也会失败。 Travis CI 最近移至 3.7.4。 😞

https://travis-ci.community/t/infinite-loop-of-virtualenv-windows/4139

来自 Travis 构建的可能有用的信息:

version: v6.2.0 https://github.com/travis-ci/worker/tree/5e5476e01646095f48eec13196fdb3faf8f5cbf7
instance: travis-ci-onion-1803-containers-1542208204-ad01dca (via amqp)
bash version 4.4.19(2)-release
Chocolatey v0.10.11
python3 v3.7.4 [Approved]
python3 has been installed.
Successfully installed pip-19.1.1
Successfully installed virtualenv-16.6.1

$ virtualenv $HOME/venv
Running virtualenv with interpreter c:\python37\python.exe
Running virtualenv with interpreter c:\python37\python.exe
Running virtualenv with interpreter c:\python37\python.exe
Running virtualenv with interpreter c:\python37\python.exe
Running virtualenv with interpreter c:\python37\python.exe
...[repeats 763 more times]...
The command "virtualenv $HOME/venv" failed and exited with 1 during .
Your build has been stopped.
MemoryError

我想只要我们加上那张支票,我们就会没事的。

不会(在 3.7.4 上)重新引入 base_executable 检查旨在修复的问题吗? 诚然,这些问题远没有那么严重,所以它可能仍然值得做,但我认为这不是一个完整的解决方案。

我不认为它会导致回归,是吗?

我还没有测试过一种或另一种方式(并且没有时间,抱歉)。

这里的结论是什么,virtualenv 是否可以修复版本?

是的,如果有人通过修复进行 PR 😊

您是否对您提到的回归进行了测试?

我想我们有。

相关测试(在 #1345 中添加)是test_create_environment_from_venv - 但请注意,它需要在所有 Python 3.7.2、3.7.3 和 3.7.4 中运行,因为每个版本的行为都不同(次要)版本,据我所知,这不是 CI 将涵盖的内容。

感谢大家的快速修复,我相信将base_executableexecutable提供了一个功能等同于简单地检查_base_executable属性的存在(可能它甚至更安全它更明确一点)

不过,我很好奇最初是什么导致了这个问题。

需要获取系统python来创建虚拟环境。 尝试使用 venv 或 virtualenv 包创建虚拟环境将不起作用。

以前sys._base_executable 3.7+仅在我们不在系统 python 中时才在 python sys.executable )。 该更改简化了 CPython 的内置代码(在系统标准库和站点包发现的部分),因此更改,但它是合同的更改。 话虽如此,鉴于它是一个私有属性,因此更改不被认为是破坏性的,所以没关系。 然后我们又无法从另一个地方获得这些信息,所以我们依赖于这个私人领域。

蟒蛇 3.7.4
遇到同样的问题,发布我们的输出以防万一它会有所帮助:

Requirement already up-to-date: virtualenv in c:\users\tester\appdata\local\programs\python\python37\lib\site-packages (16.6.1)
Running virtualenv with interpreter c:\users\tester\appdata\local\programs\python\python37\python.exe
Running virtualenv with interpreter c:\users\tester\appdata\local\programs\python\python37\python.exe
Running virtualenv with interpreter c:\users\tester\appdata\local\programs\python\python37\python.exe
...
(Repeated 350 times in total)

Traceback (most recent call last):
  File "c:\users\tester\appdata\local\programs\python\python37\lib\site-packages\virtualenv.py", line 2611, in <module>
    main()
  File "c:\users\tester\appdata\local\programs\python\python37\lib\site-packages\virtualenv.py", line 814, in main
    sub_process_call = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
  File "c:\users\tester\appdata\local\programs\python\python37\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "c:\users\tester\appdata\local\programs\python\python37\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
OSError: [WinError 8] Not enough memory resources are available to process this command

1383 已创建。 我强烈建议在合并之前进行一些手动测试。 我没有安装 3.7.4,所以我根本没有测试更改,我不知道 3.7 CI 当前正在运行什么次要版本。

也许这里报告问题的一些人可以测试更改并确认它修复了他们的问题并且不会引入任何其他损坏?

它适用于 Travis CI 上的 Python 3.7.4! 我看没有新问题。

这是我用于测试的 Travis 配置(相关部分):

    - stage: test
      os: windows
      language: shell
      env: PATH=/c/Python37:/c/Python37/Scripts:$PATH
      before_install:
        - choco install python
        # python -m pip install virtualenv
        - pip install git+https://github.com/pypa/virtualenv
        - virtualenv $HOME/venv
        - source $HOME/venv/Scripts/activate

结果(相关部分):

Progress: Downloading python 3.7.4... 100%
python3 v3.7.4 [Approved]
python3 package files install completed. Performing other installation steps.
Installing 64-bit python3...
python3 has been installed.
Installed to: 'C:\Python37'
...
16.31s$ pip install git+https://github.com/pypa/virtualenv
Collecting git+https://github.com/pypa/virtualenv
  Cloning https://github.com/pypa/virtualenv to c:\users\travis\appdata\local\temp\pip-req-build-ceb1gi36
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
    Preparing wheel metadata: started
    Preparing wheel metadata: finished with status 'done'
Building wheels for collected packages: virtualenv
  Building wheel for virtualenv (PEP 517): started
  Building wheel for virtualenv (PEP 517): finished with status 'done'
  Stored in directory: C:\Users\travis\AppData\Local\Temp\pip-ephem-wheel-cache-kx8oezso\wheels\8d\58\76\749812a30b0b5c5cdc1b327e343711660ee5ebf51cf56d2df5
Successfully built virtualenv
Installing collected packages: virtualenv
Successfully installed virtualenv-16.6.1
46.51s$ virtualenv $HOME/venv
Using base prefix 'c:\\python37'
New python executable in C:\Users\travis\venv\Scripts\python.exe
Installing setuptools, pip, wheel...
done.
0.16s$ source $HOME/venv/Scripts/activate

它适用于 Travis CI 上的 Python 3.7.4! 我看没有新问题。

太好了,谢谢确认

os: windows

我还没有意识到 Travis 现在提供了 Windows 环境,这很有趣:-)

@pfmoore他们强调 Windows 是“早期访问”并且存在问题(很明显你不能使用机密)。

是的,Windows 支持是在#travisAlums 事件发生之前推出的 IIRC(新的母公司大幅缩减了 Travis 的团队)

我有这个代码(在文件 virtualenv.py 中)来修复它:
原点是:
如果 hasattr(sys, "_base_executable"):
并改为:
如果 hasattr(sys, "_base_executable") 而不是 os.environ.get("VIRTUALENV_INTERPRETER_RUNNING"):
通过这样做,将修复循环

修复程序应通过https://pypi.org/project/virtualenv/16.6.2/发布

刚刚测试了一下,确实修复了。 非常感谢您的快速和良好的答复。

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