2013-05-08 20 views
9

Per alcuni test funzionali, invoco un paio di utilità direttamente dalla directory del progetto, utilizzando Python subprocess.call (o check_call che invoca quest'ultimo). Funziona bene quando le librerie (PyYAML in particolare) sono installate globalmente. L'esecuzione in un virtualenv, come in Travis-CI, causa problemi, specialmente se virtualenv sta eseguendo Python 3.x e il Python globale è 2.7.virtualenv e subprocess.call() in ambiente misto Python 2.7/3.3

Se entrambi i Python sono 2.7, ho comunque dovuto iniettare la posizione di PyYAML all'interno del virtualenv, utilizzando l'argomento env su subprocess.call, per non causare un ImportError. Tuttavia, questo non funziona quando virtualenv è 3.x. Sembra le piste di utilità invocati al di fuori del virtualenv perché la sua sys.path appare come segue:

'/home/travis/build/jmafc/Pyrseas/pyrseas', '/usr/local/lib/python2.7/dist-packages/distribute-0.6.35-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/pip-1.3.1-py2.7.egg', '/home/travis/build/jmafc/Pyrseas', '/home/travis/virtualenv/python3.3/lib/python3.3/site-packages', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info', '/usr/lib/python2.7/dist-packages'] 

Avviso la miscela di 2,7 e 3,3 sentieri, quest'ultimo espressamente iniettato come detto sopra.

C'è qualche modo da virtualenv o nelle funzioni subprocess per garantire che il processo secondario venga eseguito "all'interno" del virtualenv?

+0

Puoi mostrarci il tuo codice per subprocess.call? – jterrace

+0

Puoi trovare il codice [qui] (https://github.com/jmafc/Pyrseas/blob/master/pyrseas/testutils.py) nel '' DbMigrateTestCase.create_yaml'' (per esempio). –

risposta

19

Se si passa una copia delle variabili di ambiente e si utilizza l'interprete Python corrente come destinazione del sottoprocesso, l'ambiente virtualenv deve essere conservato. Qualcosa del genere:

subprocess.call([sys.executable, 'yourscript.py'], env=os.environ.copy()) 
+0

Grazie, sembra che faccia il trucco nel mio virtualenv. Ora dovrò vedere come va a Travis-CI. –