[英]Python 3.7.2 tests failure during build from unhandled exception during asyncio.run() shutdown
I'm trying to build Python 3.7.2 in a Ubuntu 18.04 Docker container with the build being optimized ( --enable-optimizations
and --with-lto
).我正在尝试在 Ubuntu 18.04 Docker 容器中构建Python 3.7.2 ,并优化构建(
--enable-optimizations
和--with-lto
)。 During this build, the tests (specifically it looks like test_sys_settrace
) fail with在此构建期间,测试(特别是它看起来像
test_sys_settrace
)失败
unhandled exception during asyncio.run() shutdown
task: <Task finished coro=<<async_generator_athrow without __name__>()> exception=RuntimeError("can't send non-None value to a just-started coroutine")>
RuntimeError: can't send non-None value to a just-started coroutine
unhandled exception during asyncio.run() shutdown
task: <Task finished coro=<<async_generator_athrow without __name__>()> exception=RuntimeError("can't send non-None value to a just-started coroutine")>
RuntimeError: can't send non-None value to a just-started coroutine
It isn't very clear to me why this is happening, and searching on unhandled exception during asyncio.run() shutdown
points to issues with the code, which I don't have control over here.我不太清楚为什么会发生这种情况,
unhandled exception during asyncio.run() shutdown
搜索unhandled exception during asyncio.run() shutdown
指向代码问题,我在这里无法控制。 I should also note that this works fine with no errors if the build is for Python 3.6.8.我还应该注意,如果构建是针对 Python 3.6.8 的,这可以正常工作,没有错误。
What follows it the relevant parts of my Dockerfile
接下来是我的
Dockerfile
的相关部分
FROM ubuntu:bionic
USER root
WORKDIR /root
SHELL [ "/bin/bash", "-c" ]
ARG PYTHON_VERSION_TAG=3.7.2
# Existing lsb_release causes issues with modern installations of Python3
# https://github.com/pypa/pip/issues/4924#issuecomment-435825490
# Set (temporarily) DEBIAN_FRONTEND to avoid interacting with tzdata
RUN apt-get -qq -y update && \
apt-get -qq -y upgrade && \
DEBIAN_FRONTEND=noninteractive apt-get -qq -y install \
gcc \
g++ \
zlibc \
zlib1g-dev \
libssl-dev \
libbz2-dev \
libsqlite3-dev \
libncurses5-dev \
libgdbm-dev \
libgdbm-compat-dev \
liblzma-dev \
libreadline-dev \
uuid-dev \
libffi-dev \
tk-dev \
wget \
curl \
git \
make \
sudo \
bash-completion \
tree \
vim \
software-properties-common && \
mv /usr/bin/lsb_release /usr/bin/lsb_release.bak && \
apt-get -y autoclean && \
apt-get -y autoremove && \
rm -rf /var/lib/apt-get/lists/*
ADD install_python.sh install_python.sh
RUN bash install_python.sh ${PYTHON_VERSION_TAG} && \
rm -r install_python.sh Python-${PYTHON_VERSION_TAG}
# There is other stuff in the Dockerfile, such as setting up a non-root user, but not relevant here
CMD [ "/bin/bash" ]
and the install script lightly edited down to only include relevant parts ( install_python.sh
)并且安装脚本经过轻微编辑以仅包含相关部分(
install_python.sh
)
#!/usr/bin/env bash
set -e
# This is being run as root and so sudo is not needed
CXX_VERSION="$(which gcc)"
function download_cpython () {
# 1: the version tag
printf "\n### Downloading CPython source as Python-${1}.tgz\n"
wget "https://www.python.org/ftp/python/${1}/Python-${1}.tgz" &> /dev/null
tar -xvzf "Python-${1}.tgz" > /dev/null
rm "Python-${1}.tgz"
}
function build_cpython () {
# 1: the prefix to be passed to configure
# c.f. https://docs.python.org/3/using/unix.html#python-related-paths-and-files
# 2: the path to the version of gcc to be used
# 3: the Python version being built
# https://docs.python.org/3/using/unix.html#building-python
# https://github.com/python/cpython/blob/3.7/README.rst
printf "\n### ./configure\n"
# --with-threads is removed in Python 3.7 (threading already on)
./configure --prefix="${1}" \
--exec_prefix="${1}" \
--with-cxx-main="${2}" \
--enable-optimizations \
--with-lto \
--enable-loadable-sqlite-extensions \
--enable-ipv6 \
CXX="${2}"
printf "\n### make -j4\n"
make -j4
printf "\n### make install\n"
make install
}
function main() {
# 1: the Python version tag
PYTHON_VERSION_TAG=3.7.2
if [[ $# -gt 0 ]]; then
PYTHON_VERSION_TAG="${1}"
fi
download_cpython "${PYTHON_VERSION_TAG}"
cd Python-"${PYTHON_VERSION_TAG}"
build_cpython /usr "${CXX_VERSION}" "${PYTHON_VERSION_TAG}"
}
main "$@" || exit 1
Any thoughts or feedback on this issue would be very much appreciated.对此问题的任何想法或反馈将不胜感激。
To be slightly verbose, the output from docker build
contains稍微冗长一点,
docker build
的输出包含
0:21:41 load avg: 0.89 [335/416] test_sys_setprofile
0:21:42 load avg: 0.89 [336/416] test_sys_settrace
unhandled exception during asyncio.run() shutdown
task: <Task finished coro=<<async_generator_athrow without __name__>()> exception=RuntimeError("can't send non-None value to a just-started coroutine")>
RuntimeError: can't send non-None value to a just-started coroutine
unhandled exception during asyncio.run() shutdown
task: <Task finished coro=<<async_generator_athrow without __name__>()> exception=RuntimeError("can't send non-None value to a just-started coroutine")>
RuntimeError: can't send non-None value to a just-started coroutine
^[[0m0:21:43 load avg: 0.89 [337/416] test_sysconfig
0:21:44 load avg: 0.89 [338/416] test_syslog
0:21:45 load avg: 0.89 [339/416] test_tarfile
# ...
# and then later
# ...
0:28:10 load avg: 1.41 [415/416] test_zipimport_support
0:28:12 load avg: 1.46 [416/416] test_zlib
Total duration: 28 min 14 sec
Tests result: FAILURE
Edit: This is also happening with Python 3.7.3编辑:这也发生在Python 3.7.3
While I still don't have a good answer as to why this was happening with builds of Python 3.7 I can report that this issues seems to be fixed in Python 3.8.1 .虽然我仍然没有很好的答案来解释为什么在 Python 3.7 的构建中会发生这种情况,但我可以报告这个问题似乎在Python 3.8.1 中得到了修复。 The
Dockerfile
and install_python.sh
used (GitHub link for them here ) are basically the same as the ones in the question with the exception of the tag being changed to 3.8.1
.使用的
Dockerfile
和install_python.sh
( 此处为它们的 GitHub 链接)与问题中的基本相同,除了标记更改为3.8.1
。
With that the tests report succeeding when built in a ubuntu:bionic
Docker image.因此,在
ubuntu:bionic
Docker 映像中构建时,测试报告成功。 The RuntimeError
s from the question have been resolved问题中的
RuntimeError
已解决
0:00:08 load avg: 6.49 [ 92/423] test_docxmlrpc passed
0:00:08 load avg: 6.49 [ 93/423] test_pickletools passed
0:00:08 load avg: 6.49 [ 94/423] test_contextlib_async passed
Task was destroyed but it is pending!
task: <Task pending name='Task-9' coro=<<async_generator_athrow without __name__>()>>
Task was destroyed but it is pending!
task: <Task pending name='Task-11' coro=<<async_generator_athrow without __name__>()>>
Task was destroyed but it is pending!
task: <Task pending name='Task-16' coro=<<async_generator_athrow without __name__>()>>
0:00:08 load avg: 6.49 [ 95/423] test_dynamic passed
0:00:08 load avg: 6.49 [ 96/423] test_userdict passed
0:00:08 load avg: 6.49 [ 97/423] test_sys_settrace passed
# ...
# and then later
# ...
0:02:42 load avg: 3.63 running: test_concurrent_futures (1 min 33 sec)
0:03:12 load avg: 3.09 running: test_concurrent_futures (2 min 3 sec)
0:03:26 load avg: 2.47 [423/423] test_concurrent_futures passed (2 min 17 sec)
== Tests result: SUCCESS ==
409 tests OK.
14 tests skipped:
test_devpoll test_gdb test_ioctl test_kqueue test_msilib
test_ossaudiodev test_startfile test_tix test_tk test_ttk_guionly
test_winconsoleio test_winreg test_winsound test_zipfile64
Total duration: 3 min 26 sec
Tests result: SUCCESS
As I can't see any reason to not upgrade from Python 3.7 to Python 3.8 (unless you're using a library that hasn't released a Python 3.8 wheel yet) I'm willing to say that just updating your Python runtime candidate is a good enough "fix" to mark this as resolved.因为我看不出有任何理由不从 Python 3.7 升级到 Python 3.8(除非您使用的库还没有发布 Python 3.8 轮子)我愿意说只是更新您的 Python 运行时候选是一个足够好的“修复”将其标记为已解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.