Python 3.7.2在asyncio.run()关闭期间从未处理的异常测试构建期间的失败

问题描述 投票:8回答:1

[我正在尝试在Ubuntu 18.04 Docker容器中构建Python 3.7.2,并优化了构建(--enable-optimizations--with-lto)。在此构建过程中,测试(特别是看起来像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

我还不清楚为什么会这样,在unhandled exception during asyncio.run() shutdown上搜索指出了代码问题,我在这里没有控制权。我还应该注意,如果构建是针对Python 3.6.8的,则可以正常工作且没有错误。

紧随其后的是我的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" ]

并且安装脚本被轻轻地编辑为仅包括相关部分(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

非常感谢您对此问题的任何想法或反馈。

稍微冗长,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

编辑: Python 3.7.3]也会发生这种情况

我正在尝试在Ubuntu 18.04 Docker容器中构建Python 3.7.2,并对其构建进行了优化(--enable-optimizations和--with-lto)。在此构建过程中,测试(特别是看起来像...

python python-3.7
1个回答
0
投票

尽管我对于为什么在python 3.7的版本中发生这种情况仍然没有很好的答案,但我可以报告说,此问题似乎已在Python 3.8.1中修复。使用的Dockerfileinstall_python.sh(它们的GitHub链接here)与问题中的相同,除了将标签更改为3.8.1

© www.soinside.com 2019 - 2024. All rights reserved.