gpt4 book ai didi

python - 操作系统错误 : [WinError 6] The handle is invalid when calling subprocess from Python 3. 6

转载 作者:太空狗 更新时间:2023-10-29 20:29:50 35 4
gpt4 key购买 nike

我正在将项目移植到 Python3,但在 Windows 上遇到意外错误:

基本上在 Windows 上的 Python 3.6 上,每次使用子进程创建进程时,我都会遇到以下异常:

d:\temp\backpack\venv\myvenv_py3.6\lib\site-packages\git\cmd.py:1011: in _call_process
return self.execute(call, **exec_kwargs)
d:\temp\backpack\venv\myvenv_py3.6\lib\site-packages\git\cmd.py:732: in execute
**subprocess_kwargs
D:\temp\cpython-3.6.3\Lib\subprocess.py:611: in __init__
_cleanup()
D:\temp\cpython-3.6.3\Lib\subprocess.py:220: in _cleanup
res = inst._internal_poll(_deadstate=sys.maxsize)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <subprocess.Popen object at 0x0000000004FD53C8>
_deadstate = 9223372036854775807
_WaitForSingleObject = <built-in function WaitForSingleObject>
_WAIT_OBJECT_0 = 0, _GetExitCodeProcess = <built-in function GetExitCodeProcess>

def _internal_poll(self, _deadstate=None,
_WaitForSingleObject=_winapi.WaitForSingleObject,
_WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
_GetExitCodeProcess=_winapi.GetExitCodeProcess):
"""Check if child process has terminated. Returns returncode
attribute.

This method is called by __del__, so it can only refer to objects
in its local scope.

"""
_log.debug('proc._internal_poll self.pid=%s self._handle=%s self.returncode=%s self=%s', self.pid, self._handle, self.returncode, self)
if self.returncode is None:
> if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
E OSError: [WinError 6] The handle is invalid

D:\temp\cpython-3.6.3\Lib\subprocess.py:1051: OSError

subprocess 在哪里并不重要正在创建调用(在这个项目中,很多来自 GitPython 包和 plumbum )。

这次执行发生在这个保护伞下:build script调用 venv/Scripts/coverage run -m pytest -v tests/ .但我也试过 pytest-covvenv/Scripts/pytest --cov=mypackage --cov-config .coveragerc - tests/在繁殖方面:

  • 在我的 Win 7 PC 上它总是通过 :(
  • 在 Win 7 虚拟机上:
    • 它总是失败当[ <build script>调用 venv/Scripts/coverage run -m pytest ]
    • coverage run -m pytest 时它总是失败直接从 venv 调用
    • 但当 pytest 时它总是通过直接从 virtualenv 调用
  • 在 Win 10 PC 上它总是失败,无论 <build script>被调用,或者如果 coveragepytest直接从 venv 调用

到目前为止我得到的唯一线索来自这个 StackOverflow 线程:https://stackoverflow.com/a/43975118更准确地说,是第一个接受的答案中的评论指向与 _cleanup 相关的有用信息。来自 subprocess 的方法模块。

最佳答案

稍作停顿,我很快找到了这背后的原因。

是因为项目中GitPython的使用没有调用git.Repo.close()或者使用了git.Repo 作为上下文管理器。有一个 warning about thisGitPython 的自述文件中。

subprocess_internal_poll 方法中添加日志有助于了解哪个进程 (args) 是罪魁祸首。对于 GitPython 它是 git cat-file ...

关于python - 操作系统错误 : [WinError 6] The handle is invalid when calling subprocess from Python 3. 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47535676/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com