2014-09-10 25 views
8

mam konfigurowania Travis-ci dla mojego projektu, i dziwnie, nie mogę zaimportować projekt:Jak dodać mój moduł Travis-ci PYTHONPATH

$ python tests/tests.py 
Traceback (most recent call last): 
    File "tests/tests.py", line 11, in <module> 
    from my_module.lib.importer import build_module_list 
ImportError: No module named my_module.lib.importer 

W produkcji, po prostu utworzyć symlink like:

sudo ln -s /usr/local/my_module /usr/lib/python2.7/dist-packages/my_module 

Ale nie wiem - lub chcę wiedzieć, naprawdę - struktura folderów Travis-CI.

Wydaje się, że to rozwiązany problem, ale jestem nowy w Travis-CI. Jaki jest najlepszy sposób, aby to zadziałało, więc mój kod został dodany jako importowalny moduł?

Odpowiedz

14

Jaki jest najlepszy sposób, aby tej pracy, więc mój kod jest dodawany jako moduł importable?

Odpowiedź jest jednoznacznie używać distutils (i na pewno nie ln).

W produkcji, po prostu utwórz dowiązania ...

B-b-ale dlaczego? Złożoność, aby to zrobić Right Way ™ jest tak niska! To nawet pasuje w kilku zdaniach:

Od The Fine Manual - wystarczy utworzyć setup.py takiego:

from distutils.core import setup 

setup(name='Distutils', 
     version='1.0', 
     description='Python Distribution Utilities', 
     author='Greg Ward', 
     author_email='[email protected]', 
     url='https://www.python.org/sigs/distutils-sig/', 
     packages=['distutils', 'distutils.command'], 
    ) 

Teraz można robić fantastyczne rzeczy jak python setup.py install, python setup.py bdist_rpm lub pip install . - i to nie tylko w Travis środowisko, ale ogólnie dla twojego projektu.

+0

To bardzo fajne. Zawsze zakładałem, że było o wiele trudniej. – mlissner

+5

Dla przypomnienia, spędziłem dwie godziny próbując rozwiązać ten problem dla mojej paczki. Ostrzeżenie dla innych: To nie jest takie proste. (Nic nie jest takie proste.) – mlissner

+0

@mlissner Jeśli to nie było takie proste, czego brakowało w tym rozwiązaniu? – slizb

1

To z pewnością nie jest optymalne, ale zadziałało. W moim .travis.yml pliku dodałem następującą linię do atrybutu install:

- ln -s `pwd` $(dirname `which python`)/../lib/python2.7/site-packages/my_module 

Zasadniczo znajdzie katalog, w którym zainstalowany jest Python, a następnie dodaje my_module jako dowiązania symbolicznego tam. Cieszę się, że słyszę lepszą odpowiedź, bo ta jest bardzo delikatna.

Aktualizacja: Zobacz odpowiedź @Brian Cain na znacznie lepsze rozwiązanie.

6

być szybki, można rozwiązać ten problem bardziej elegancko przez dodanie następujących do etapu before_script:

export PYTHONPATH=$PYTHONPATH:$(pwd) 

Lepszym sposobem (ale z trochę więcej wysiłku) jest co Brian Cain zasugerował, mianowicie , napisz plik setup.py i dodaj pip install . do etapu install.

Lub jeśli używasz pliku Makefile, możesz mieć polecenie, które robi to jako następne.

test: 
    $(shell export PYTHONPATH=$PYTHONPATH:$(pwd)) 
    python setup.py test 
+2

'pip zainstalować .' nie działa na Travis dla mnie. – skolsuper

0

Najprawdopodobniej konieczne będzie dodanie /home/travis/.local/lib/python2.7/site-packages/ do PYTHONPATH w before_script przy użyciu export PYTHONPATH=$PYTHONPATH:/home/travis/.local/lib/python2.7/site-packages/.

1

W uzupełnieniu odpowiedzi @ Brian-Cain można również użyć setuptools zamiast distutils. W trakcie pisania distutils jest stopniowo wycofywany, a setuptools jest używany jako zamiennik, mimo że setuptools nie jest jeszcze w standardowej bibliotece.

from setuptools import setup, find_packages 

setup(name='Foo', 
     version='0.0.1', 
     description='Python Distribution Utilities', 
     author='', 
     author_email='', 
     url='', 
     packages=find_packages(exclude=['contrib', 'docs', 'tests*']), 
    ) 

Na szybki tutorial dokonywania setup.py z setuptools: https://packaging.python.org/tutorials/distributing-packages/

na szybki rzeczywistym przykład: https://github.com/pypa/sampleproject/blob/master/setup.py