如何在非 python travis 配置中使用 python 3 作为构建脚本?

How to use python 3 as a build script in non-python travis configuration?

我正在尝试在使用基于 python3 的自定义构建脚本的 C 库上使用 Travis CI

构建存储库时,它在 ./configure 上失败,因为配置使用 Python 3,默认情况下未安装。

如果我正在构建一个 Python 项目,我会在我的 .travis.yml:

中使用它
python:
  - "3.4"

然而,这似乎并不影响我的存储库,因为它是在 C 中。(我尝试了 运行 which python3python --version,报告说 python 3 不存在,取而代之的是 python 2.7。)

我试过的构建脚本:

language: c

python:
  - "3.4"

当我的项目不是 Python 项目时,如何在 Travis CI 中使用 Python 3?

您应该能够通过添加 .travis.yml:

before_install: 部分来安装所需的 python3 软件包
before_install:
- sudo apt-get update
- sudo apt-get install python3

如果您想使用基于容器的基础设施,您可以使用 apt addon:

addons:
  apt:
    sources:
      - deadsnakes # source required so it finds the package definition below
    packages:
      - python3.5

可以使用的包有listed here

更新

为了使用像 psycopg2 或 pyYAML 这样的 c 扩展的依赖,还需要添加 python3.4-dev

mfussenegger 的回答是现在推荐的安装方式,但是 deadsnakes 软件包似乎不提供 python3 的链接,只提供 python3.* 的链接。如果您需要最新的 python 3 版本,则可以使用它。当前的 travis 建立在 Ubuntu LTS 12.04 之上,后者随 python 3.2 一起提供,足以满足大多数脚本目的。

python 3.* 是使用 shebang 启动脚本时的一个问题,我们不能在其中包含任意名称检查。这就是为什么您可能仍然需要 python3 包,如 Eric Appelts 的回答:

addons:
  apt:
    packages:
      - python3

Travis 使用 pyenv 来管理其 Python,并且在撰写本文时默认安装了 Python 2.7.16 和 3.6.3。可以用pyenv global 3.6来使用Python 3.6.3;你不需要root。

这是获得 Python 3 的最简单和最快的方法,在不需要特定 Python 3 版本(例如构建脚本等)的情况下非常有用.如果您想要特定的 Python 版本 and/or 构建矩阵,那么按照其他一些答案中提到的那样将其安装为软件包或插件可能会更快更容易。

这就是我的工作方式(bionic):

dist: bionic
addons:
  apt:
    sources:
      - deadsnakes
    packages:
      - python3.7
before_install:
  - sudo apt-get update
  - sudo apt purge python2.7-minimal
  - sudo apt-get install python3 python3-pip python3-setuptools
  - pip3 install --upgrade pip

自己看:.travis.yml.

不幸的是,我的 C++ CMake 项目在从 deadsnakes 安装 python3.7 和 python3.7-dev 时无法正确找到 python 库进行链接。

有效的方法是使用 pyenv,但是在 Travis 提供的 Ubuntu Xenial dist 上,pyenv 的发布版本太旧并且没有 Python 3.7 可用。我要做的是先更新 pyenv:

  install:
    - PYENV_VERSION=1.2.20
    - PYTHON_VERSION=3.7.8
    - pushd $(pyenv root)
    - git fetch
    - git checkout v$PYENV_VERSION
    - pyenv install -v $PYTHON_VERSION
    - popd
  before_script:
    - pyenv global $PYTHON_VERSION
    - PYTHON_PREFIX=$(python-config --prefix)
    - PYTHON_XY=python${PYTHON_VERSION%.*} # X.Y.Z -> pythonX.Y
    - CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE=$PYTHON_PREFIX/bin/$PYTHON_XY"
    - CMAKE_EXTRA_ARGS+=" -DPYTHON_LIBRARY=$PYTHON_PREFIX/lib/lib${PYTHON_XY}m.so"
    - CMAKE_EXTRA_ARGS+=" -DPYTHON_INCLUDE_DIR=$PYTHON_PREFIX/include/${PYTHON_XY}m"
  script:
    - cmake .. -DCMAKE_BUILD_TYPE=Release ${CMAKE_EXTRA_ARGS}
    - make

概览

  • 一种更简洁、更模块化的方法是使用 .python-version 配置文件 [1] 而不是必须通过 pyenv global 3.6 在 Travis 配置文件中直接指定 Python 版本命令。
  • 例如我在我的 Node.js 项目中成功安装并使用了 yamllintPython 3.6.9

解决方案详细信息

  • 在项目的根目录中,创建一个 .python-version 并指定 python 3.6 别名作为其内容。
    • 使用 bionic 发行版时,Travis 会将 3.6 解析为默认的 3.6 Python 安装
    • 例如3.6.9[2]
  • 可选地,在您的 Travis 配置文件中执行以下操作:
    • (a) 指示 Travis 通过 cache 语法
    • 在构建之间缓存任何 Python 包
    • (b)升级pip默认版本Python 3.6.9.
    • (c) 安装 yamllint 作为全局包
      • 注意:language不是python时必须全局安装 [3].

.python-版本

3.6

.travis.yml

dist: bionic
language: node_js
cache:
  pip: true
before_install:
  # Upgrade pip
  - python -m pip install --quiet --upgrade pip
  # Install yamllint
  - pip install --quiet --user yamllint

资源