带有anaconda和travis的多个python版本

时间:2017-04-10 17:30:58

标签: python anaconda travis-ci

我有一个python项目,它使用了需要构建的库。鉴于我使用anaconda。我想创建一个travis计划,让我测试多个python版本,我无法做到。这就是我所拥有的:

  • 我想针对多个python版本(例如2.7,3.5,3.6)进行测试
  • 我有requirements.yml文件,如下所示:
  channels:
       - kne 
  dependencies:
       - numpy
       - pytest
       - numpy
       - scipy
       - matplotlib
       - seaborn
       - pybox2d
       - pip:
        - gym
        - codecov
        - pytest
        - pytest-cov

我的.travis.yml包含:

language: python

# sudo false implies containerized builds
sudo: false

python:
  - 3.5
  - 3.4

before_install:
# Here we download miniconda and install the dependencies
- export MINICONDA=$HOME/miniconda
- export PATH="$MINICONDA/bin:$PATH"
- hash -r
- wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh
- bash miniconda.sh -b -f -p $MINICONDA
- conda config --set always_yes yes
- conda update conda
- conda info -a
- echo "Python version var"
- echo $TRAVIS_PYTHON_VERSION
- conda env create -n testenv -f environment.yml python=$TRAVIS_PYTHON_VERSION
- source activate testenv

install:
- python setup.py install

script:
- python --version
- python -m pytest --cov=.
- codecov

如果我将python版本放入environment.yml它可以正常工作,但我不能使用多个python版本。对我来说,似乎提供了-f,它会忽略为conda env create列出的任何其他包。

此外,在env创建后添加- conda install -n testenv python=$TRAVIS_PYTHON_VERSION不起作用。

UnsatisfiableError: The following specifications were found to be in conflict:
  - functools32 -> python 2.7.*
  - python 3.5*
Use "conda info <package>" to see the dependencies for each package.

我该怎么做才能让它发挥作用?

//如果您想了解更多详情,请访问:https://travis-ci.org/mbednarski/Chiron/jobs/220644726

1 个答案:

答案 0 :(得分:1)

在创建conda环境之前,您可以使用sed修改environment.yml文件中的python依赖项。

在environment.yml中包含python:

channels:
    - kne 
dependencies:
    - python=3.6
    - numpy
    - pytest
    - numpy
    - scipy
    - matplotlib
    - seaborn
    - pybox2d
    - pip:
        - gym
        - codecov
        - pytest
        - pytest-cov

然后修改.travis.yml:

before_install:
    # Here we download miniconda and install the dependencies
    - export MINICONDA=$HOME/miniconda
    - export PATH="$MINICONDA/bin:$PATH"
    - hash -r
    - wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh
    - bash miniconda.sh -b -f -p $MINICONDA
    - conda config --set always_yes yes
    - conda update conda
    - conda info -a
    - echo "Python version var"
    - echo $TRAVIS_PYTHON_VERSION
    # Edit the environment.yml file for the target Python version
    - sed -i -E 's/(python=)(.*)/\1'$TRAVIS_PYTHON_VERSION'/' ./environment.yml
    - conda env create -n testenv -f environment.yml
    - source activate testenv

sed正则表达式将文本python = 3.6替换为目标python版本的等效文件。

BTW:我在您的存储库中看到您通过使用多个environment.yml文件解决了这个问题。这似乎是合理的,甚至对于某些依赖项来说是必需的,但对于许多Python版本来说可能很繁琐。