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

36

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

当构建存储库时,由于configure使用Python 3,默认情况下未安装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?


你是否尝试按照文档中的建议,在构建日志中查看“构建系统信息”? - skeggse
1
@skeggse 那个部分没有关于Python的内容,可能是因为这是一个C项目,而不是Python项目。 - Cel Skeggs
我有同样的问题。即使使用“before_install”方式也无法解决。你找到其他设置默认Python版本的方法了吗? - pjhades
7个回答

21
如果您想使用基于容器的基础架构,可以利用 apt addon
addons:
  apt:
    sources:
      - deadsnakes # source required so it finds the package definition below
    packages:
      - python3.5

可以使用的包在此处列出。

更新

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


4
太好了,但我该如何使用它呢?它似乎没有被添加到路径中(调用python3不起作用,python3.5也是如此)。 - mvd
很奇怪,我们安装了Python3.4并且调用它也完全正常。 这是yml文件:https://github.com/crate/crate/blob/0.56/.travis.yml#L49 这是使用方法:https://github.com/crate/crate/blob/0.56/blackbox/bootstrap.sh#L5 - mfussenegger

14

您只需要在您的.travis.yml文件中添加一个before_install:部分,就可以安装所需的Python3软件包:

before_install:
- sudo apt-get update
- sudo apt-get install python3

为什么要使用 before_install 而不是 install - Cel Skeggs
我不完全确定为什么您不能使用“install”,但是Travis文档建议在“before_install”期间安装Ubuntu软件包:http://docs.travis-ci.com/user/installing-dependencies/#Installing-Ubuntu-packages - Eric Appelt
谢谢!它起作用了。我最终还包括了 sudo: true,因为在你回答之前我已经解决了部分问题,但我不确定是否需要这样做才能使其正常工作。 - Cel Skeggs
我接受这个方案,因为它可行,但如果有人有不需要切换基于容器的基础设施的解决方案,我更愿意采用那个。 - Cel Skeggs

6

Travis使用pyenv管理Python,目前默认安装了Python 2.7.16和3.6.3。你可以使用pyenv global 3.6来使用Python 3.6.3,无需root权限。

这是获取Python 3最简单和最快的方法,并且在不需要特定Python 3版本(例如用于构建脚本等)的情况下非常有用。如果您需要特定的Python版本和/或构建矩阵,则安装为软件包或插件可能更快更容易,正如其他答案中提到的那样。


当pyenv没有你需要的版本时,问题就出现了,然后你需要想办法使用pyenv安装那个版本。 - smac89
@smac89 有没有关于如何在Travis上使用pyenv安装新版本的示例? - Boris Dalstein
@BorisDalstein 运行 pyenv install 3.8.4 命令,然后运行 pyenv global 3.8.4。老实说,我会放弃使用 pyenv,而采用这个其他答案 - smac89
@smac89 谢谢,我已经尝试过 pyenv install -v 3.7.7(和其他版本),但是它报错说该 Python 版本不可用。pyenv install --list | grep 3.7 没有返回任何结果。我会尝试你建议的使用 deadsnakes PPA 的另一种方法,目前 Travis 上的 pyenv 让我发疯了... - Boris Dalstein
@smac89 跟进:最终,我使用了 pyenv 而不是 deadsnakes PPA,但首先必须更新 pyenv 以便它可以找到 Python 3.7。请参阅我的新答案。无论如何,感谢您的帮助! - Boris Dalstein
是的,我的使用情况只是需要一个Python 3来编写一个相当简单的项目构建脚本,该项目本身并不使用Python @smac89;使用pyenv来管理您的构建矩阵会带来很多麻烦,在这种情况下安装软件包/插件更容易。我将修改答案以避免混淆。 - Martin Tournoij

3

mfussenegger的答案是现在安装软件的推荐方式,然而deadsnakes包似乎没有提供python3的链接,只有python3.*的链接。如果您需要一个最新的Python 3版本,则可以使用它。当前的travis构建在Ubuntu LTS 12.04上,该版本自带python 3.2,对于大多数脚本目的来说已经足够了。

当使用shebang启动脚本时,python 3.*会引起问题,因为我们不能包含任意名称检查。这就是为什么您可能仍然需要python3软件包,就像Eric Appelt的答案中所述:

addons:
  apt:
    packages:
      - python3

1
很遗憾,我的C++ CMake项目在安装deadsnakes的python3.7和python3.7-dev时未能正确找到链接的python库。
解决方法是使用pyenv,但在Travis提供的Ubuntu Xenial版本上,预装的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

0

概述

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

解决方案详细信息

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

.python-version

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

资源


0

对我来说(在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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接