2014-09-10 13 views
8

Sono la creazione di Travis-CI per il mio progetto, e stranamente, non riesco a importare il mio progetto:Come aggiungere il mio modulo di 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 

Nella produzione, mi basta creare una symlink like this:

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

Ma io non so - o voglio sapere, davvero - la struttura delle cartelle di Travis-CI.

Questo sembra un problema risolto, ma sono nuovo a Travis-CI. Qual è il modo migliore per farlo funzionare, quindi il mio codice viene aggiunto come un modulo importabile?

risposta

14

Qual è il modo migliore per fare questo lavoro, quindi il mio codice viene aggiunto come modulo importabile?

La risposta è inequivocabilmente da usare distutils (e sicuramente non ln).

Nella produzione, mi basta creare un link simbolico ...

B-B-ma perché? La complessità per farlo nel modo giusto ™ è così bassa! Si adatta anche in poche righe:

Da The Fine Manual - basta creare un setup.py come questo:

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'], 
    ) 

Ora si possono fare cose fantastiche come python setup.py install, python setup.py bdist_rpm o pip install . - e non solo nel Travis ambiente ma per il tuo progetto in generale.

+0

Beh, è ​​davvero fantastico. Ho sempre pensato che fosse molto più difficile. – mlissner

+5

Per la cronaca, ho appena trascorso due ore cercando di risolvere questo problema per il mio pacco. Attenzione agli altri: non è così semplice. (Niente è così semplice.) – mlissner

+0

@mlissner Se non fosse così semplice, cosa mancava da questa soluzione? – slizb

1

Questo non è certamente ottimale, ma ha funzionato. Nel mio file .travis.yml, ho aggiunto la seguente riga per l'attributo install:

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

questo trova fondamentalmente la directory in cui è installato Python e poi aggiunge my_module come un collegamento simbolico in là. Felice di sentire una risposta migliore, perché questo si sente estremamente fragile.

Aggiornamento: vedere la risposta di @Brian Cain per una soluzione molto migliore.

6

essere veloce, è possibile risolvere il problema più elegantemente aggiungendo quanto segue al before_script fase:

export PYTHONPATH=$PYTHONPATH:$(pwd) 

Il modo migliore (ma con un piccolo sforzo in più) è ciò che Brian Cain ha suggerito, vale a dire , scrivere un file setup.py e aggiungere pip install . allo stage install.

Oppure se si sta utilizzando un makefile è possibile avere il comando che lo fa come il seguente.

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

'.' PIP installazione non funziona su travis per me. – skolsuper

0

È più probabile che sia necessario aggiungere /home/travis/.local/lib/python2.7/site-packages/ a PYTHONPATH in before_script utilizzando export PYTHONPATH=$PYTHONPATH:/home/travis/.local/lib/python2.7/site-packages/.

1

In aggiunta alla risposta @ Brian-Cain, è anche possibile utilizzare setuptools anziché distutils. Al momento della scrittura, distutils è in fase di eliminazione e setuptools viene utilizzato come sostituzione, anche se setuptools non è ancora nella libreria standard.

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*']), 
    ) 

Per un breve tutorial sulla creazione di un setup.py con setuptools: https://packaging.python.org/tutorials/distributing-packages/

Per un esempio reale veloce: https://github.com/pypa/sampleproject/blob/master/setup.py

Problemi correlati