2014-07-18 17 views
10

Sto provando a far sì che Tox e Conda suonino insieme bene. Principalmente perché ho un sacco di dipendenze non python che devono essere installate ed è stato facile creare distribuzioni Conda. Quindi posso installare tutto con un semplice conda install.Errore durante l'utilizzo dell'origine in un file Tox ini python

Tuttavia, ho problemi con l'attivazione dell'ambiente conda.

[tox] 
envlist = py27 

[testenv] 
whitelist_externals = 
    conda 
    source 
    py.test 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
install_command = 
    python build_env.py --conda-env {toxworkdir}/conda {packages} 
commands = 
    source activate {toxworkdir}/conda 
    py.test --basetemp={envtmpdir} 

Il python build_env.py --conda-env {toxworkdir}/conda {packages} si occupa della creazione dell'ambiente (se necessario), installare i pacchetti, ecc Il problema arriva alla linea source activate {toxworkdir}/conda. Ottengo un errore ERROR: InvocationError: could not find executable 'source'. Digitando il comando direttamente nella riga di comando funziona bene.

Per coloro che sono interessati. Il build_env.py si trova in questo Gist: https://gist.github.com/JudoWill/70450979353fa2d12823 ... Attualmente sta solo installando le dipendenze Python ma nel suo ambiente previsto installerà i repository di Conda che non sono necessariamente librerie python. Qualche idea?

+0

Non conosco né conda né tox, ma poiché sembra che tu sia in grado di eseguire script Python in questo modo, non puoi scrivere uno script per avvolgere quella chiamata a 'source', simile a' build_env.py'? –

+0

Provato. A causa del modo in cui Tox funziona, la shell viene persa tra le sezioni 'install_command' e' commands' della corsa. Ho anche provato a incapsulare i due 'comandi' in un singolo bash-script. Questo dà anche "InvocationError". – JudoWill

+0

Puoi mostrare cosa c'è dentro 'build_env.py'? Grazie. – alecxe

risposta

7

Dopo un sacco di ritocchi ho capito un work-around. È probabilmente fragile rispetto a qualsiasi cambiamento in Tox, ma finché funzionano i test nell'ordine fornito da envlist, allora dovrebbe funzionare.

Come suggerito da @asmeurer nella sua risposta, il trucco è in qualche modo modificare lo PATH come riconosciuto da tox. Ma per generare il conda/bin ho bisogno di eseguire conda create. Innanzitutto, ho provato a utilizzare lo export PATH={toxworkdir}/conda/bin:$PATH suggerito da asmeurer, ma questo si è verificato nello stesso numero InvocationError solo con export anziché source.

Successivamente, ho provato a utilizzare la sezione tox setenv per modificare il percorso. Ciò ha provocato un problema alle uova di pollo &. Non è stato possibile aggiungere la directory bin finché non ho eseguito il comando conda create. A causa dell'ordine predefinito dei comandi in Tox, non sembra che io possa ottenere che lo setenv diventi (o riesegua) dopo lo install_command.

Il lavoro attorno a cui sono giunto è stato creare un nuovo env da testare e condividere questo ambiente con i test successivi.

[tox] 
envlist = setup,py27 

[testenv] 
whitelist_externals = 
    conda 
    source 
    py.test 

[testenv:setup] 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
commands = 
    conda config --add channels judowill 
    python build_env.py --conda-env {toxworkdir}/conda {packages} 

[testenv:py27] 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
    PATH={toxworkdir}/conda/bin:$PATH 
commands = 
    {toxworkdir}/conda/bin/py.test --basetemp={envtmpdir} 

Questo funziona. Non sono sicuro di quanto sarebbe difficile generalizzare questo in un ambiente Python multiplo, ma funziona per me.

6

source non è un comando. È una shell integrata. source script.sh causa l'esecuzione di script.sh all'interno della shell corrente. Questo è necessario per activate, perché modifica il PERCORSO e si desidera che tali modifiche influiscano sulla shell stessa (normalmente, quando si esegue uno script, viene eseguito in una subshell, che ha il proprio ambiente che non può influire sull'ambiente della shell chiamante) .

Non so se tox supporta l'impostazione delle variabili di ambiente nei comandi. Se è così, si può semplicemente utilizzare

export PATH={toxworkdir}/conda/bin:$PATH 

In caso contrario, basta utilizzare il percorso assoluto per tutti i comandi, come

{toxworkdir}/conda/bin/py.test --basetemp={envtmpdir} 
+1

Ripristina il percorso dopo l'esecuzione del programma? – JudoWill

+0

'PATH' sarà impostato solo su tox. Ogni volta che si modifica una variabile d'ambiente in un programma o in uno script, questo influisce solo sull'ambiente di quel programma, non sulla propria shell (l'eccezione è che si abbia uno script di bash che si chiama con 'source'). – asmeurer

+0

Nessun dado. Ora ricevo un errore di chiamata sul comando 'export'. 'ERRORE: InvocationError: impossibile trovare l'esportazione 'export'' – JudoWill

Problemi correlati