2012-01-25 16 views
5

Sono abbastanza appassionato di Python virtualenv, che facilita la manutenzione di configurazioni Python separate. Sto considerando di incorporare Python in un'applicazione C++ e mi stavo chiedendo come si comporterebbe il Python incorporato rispetto agli ambienti virtuali.Ambienti virtuali e incorporamento Python

In particolare, sono interessato a sapere se è possibile "selezionare" un ambiente virtuale basato su alcune impostazioni definite dall'utente (ad esempio denominando l'ambiente virtuale di interesse in un file di configurazione).

risposta

3

La documentazione virtualenv include una sezione Using virtualenv without bin/python che allude alla come configurare un ambiente virtuale, una volta l'interprete è già in esecuzione

per evitare hardcoding il percorso dello script activate_this.py, io uso il seguente frammento:.

def resolve_virtual_environment(override=None): 
    """Fetch the virtual environment path in the 
     process' environment or use an override.""" 
    path = os.getenv('VIRTUAL_ENV') 
    if override: 
     path = os.path.join(os.getcwd(), override) 
    return path 

def activate_virtual_environment(environment_root): 
    """Configures the virtual environment starting at ``environment_root``.""" 
    activate_script = os.path.join(
     environment_root, 'Scripts', 'activate_this.py') 
    execfile(activate_script, {'__file__': activate_script}) 

E lo si può utilizzare in questo modo:

if __name__ == '__main__': 
    # use first argument is provided. 
    override = None 
    if len(sys.argv) > 1: 
     override = sys.argv[1] 
    environment_root = resolve_virtual_environment(override) 

È possibile recuperare il valore override da un file di configurazione o qualcosa invece che dalla argomento della riga di comando.

Si noti che è possibile utilizzare solo un pre-processo di un singolo ambiente virtuale.

Nota: contrariamente all'uso dell'interprete in bundle nell'ambiente virtuale, si ha accesso ai pacchetti installati per l'interprete che è stato avviato. Ad esempio, quando si utilizza Python installato a livello globale, si avrà accesso ai pacchetti installati globalmente.

Assicurarsi inoltre di utilizzare un interprete Python con una versione corrispondente a qualsiasi versione utilizzata per creare l'ambiente virtuale per assicurarsi che la versione standard della libreria (copiata nell'ambiente virtuale) corrisponda alla versione dell'interprete Python.

+0

Grazie per questo. Avevo solo bisogno di farlo dal lato C++ e ho imitato la tua soluzione all'interno di Boost :: Python. Esso funziona magicamente ! :) – ereOn

0

Sì, sicuramente. È solo questione di dove impostare PYTHONPATH (o cosa si compila in).

Assicuratevi di controllare pythonqt (per non essere scambiato per PySide o PyQt .. va nella direzione opposta, la costruzione di un Python in un'applicazione Qt C++.

+0

In realtà, ho lavorato su [il mio wrapper Python/C++] (https://github.com/AndreLouisCaron/cxxpy) per scrivere un bridge WSGI in C++. Questo è tutto per scopi didattici :-) Ho capito per lo più le cose WSGI, e lentamente l'ho integrato con alcuni gestori FastCGI e SCGI. –

+0

Sta usando 'virtualenv' in realtà solo un modo" intelligente "di modificare' PYTHONPATH'? –

+0

Mi sembra così. C'è un sacco di vetrine su come funziona, le figure si aprono, le "partizioni" e qualche configurazione. Non sto affatto cercando di sminuire virtualenv, ma non è come se fosse un ambiente chroot. Semplicemente imposta la nozione di dove è "casa" ed è in bundle con una serie di strumenti per l'installazione di nuovi moduli che crederanno anche la stessa cosa. – synthesizerpatel

Problemi correlati