Scipy ImportError на travis-ci

Я впервые создаю Travis-CI. Я устанавливаю scipy в том, что я считаю стандартным способом:

language: python
python:
  - "2.7"
# command to install dependencies
before_install:
  - sudo apt-get -qq update
  - sudo apt-get -qq install python-numpy python-scipy python-opencv
  - sudo apt-get -qq install libhdf5-serial-dev hdf5-tools
install:
   - "pip install numexpr"
   - "pip install cython"
   - "pip install -r requirements.txt --use-mirrors"
# command to run tests
script: nosetests

Все строит. Но когда начинаются носеты, я получаю

ImportError: No module named scipy.ndimage

Обновление: Вот более непосредственная демонстрация проблемы.

$ sudo apt-get install python-numpy python-scipy python-opencv
$ python -c 'import scipy'
Traceback (most recent call last):
  File "<string>", line 1, in <module>

ImportError: No module named scipy

The command "python -c 'import scipy'" failed and exited with 1 during install.

Я попробовал установить scipy, используя pip. Сначала я попытался установить gfortran. Вот пример неудачной сборки. Любые предложения?

Другое обновление. С тех пор Трэвис добавил официальную документацию по использованию конды с Travis. См. Ответ ostrokach.

Ответы

Ответ 1

Я нашел два способа преодоления этой трудности:

  • Как предложил @unutbu, создайте свою собственную виртуальную среду и установите все, используя pip внутри этой среды. Я получил сборку, но установка scipy из исходного файла происходит очень медленно.

  • Следуя подходу, используемому проектом pandas в этом файле .travis.yml и сценариях оболочки, которые он вызывает, force travis для использования общесистемных пакетов сайтов и установки numpy и scipy с помощью apt-get. Это намного быстрее. Ключевыми строками являются

    virtualenv:
        system_site_packages: true
    

    в travis.yml перед группой before_install, за которой следуют эти команды оболочки

    SITE_PKG_DIR=$VIRTUAL_ENV/lib/python$TRAVIS_PYTHON_VERSION/site-packages
    rm -f $VIRTUAL_ENV/lib/python$TRAVIS_PYTHON_VERSION/no-global-site-packages.txt  
    

    а затем, наконец,

    apt-get install python-numpy
    apt-get install python-scipy
    

    который будет найден, когда nosetests попытаются импортировать их.

Обновление

Теперь я предпочитаю сборку на основе conda, которая быстрее, чем любая из вышеприведенных стратегий. Вот один пример в проекте, который я поддерживаю.

Ответ 2

Это описано в официальной документации по conda: Использование conda с Travis CI.


Файл .travis.yml

Ниже показано, как изменить файл .travis.yml для использования Miniconda для проекта, который поддерживает Python 2.6, 2.7, 3.3, и 3.4.

ПРИМЕЧАНИЕ. См. веб-сайт Travis CI для получения информации о базовой конфигурации для Travis.

language: python
python:
  # We don't actually use the Travis Python, but this keeps it organized.
  - "2.6"
  - "2.7"
  - "3.3"
  - "3.4"
install:
  - sudo apt-get update
  # We do this conditionally because it saves us some downloading if the
  # version is the same.
  - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
      wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
    else
      wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
    fi
  - bash miniconda.sh -b -p $HOME/miniconda
  - export PATH="$HOME/miniconda/bin:$PATH"
  - hash -r
  - conda config --set always_yes yes --set changeps1 no
  - conda update -q conda
  # Useful for debugging any issues with conda
  - conda info -a

  # Replace dep1 dep2 ... with your dependencies
  - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION dep1 dep2 ...
  - source activate test-environment
  - python setup.py install

script:
  # Your test script goes here

Ответ 3

Я нашел этот подход для работы:

http://danielnouri.org/notes/2012/11/23/use-apt-get-to-install-python-dependencies-for-travis-ci/

Добавьте эти строки в конфигурацию Travis, чтобы использовать virtualenv с --system-site-packages:

virtualenv:
  system_site_packages: true

Таким образом, вы можете установить пакеты Python через apt-get в разделе before_install и использовать их в своем virtualenv:

before_install:
 - sudo apt-get install -qq python-numpy python-scipy

Реальное использование этого подхода можно найти в nolearn.

Ответ 4

Как отметил Дэн Аллан в своем обновлении, он теперь предпочитает сборку на базе конды. Вот вам данность Дан Бланшар, дающая полный пример файла .travis.yml, который предварительно установит scipy на тестовой машине:

language: python
python:
  - 2.7
  - 3.3
notifications:
  email: false

# Setup anaconda
before_install:
  - wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh
  - chmod +x miniconda.sh
  - ./miniconda.sh -b
  - export PATH=/home/travis/miniconda/bin:$PATH
  - conda update --yes conda
  # The next couple lines fix a crash with multiprocessing on Travis and are not specific to using Miniconda
  - sudo rm -rf /dev/shm
  - sudo ln -s /run/shm /dev/shm
# Install packages
install:
  - conda install --yes python=$TRAVIS_PYTHON_VERSION atlas numpy scipy matplotlib nose dateutil pandas statsmodels
  # Coverage packages are on my binstar channel
  - conda install --yes -c dan_blanchard python-coveralls nose-cov
  - python setup.py install

# Run test
script:
  - nosetests --with-cov --cov YOUR_PACKAGE_NAME_HERE --cov-config .coveragerc --logging-level=INFO

# Calculate coverage
after_success:
  - coveralls --config_file .coveragerc