2013-03-12 9 views
25

ich erstellen und aktivieren eine virtualenv (Venv) mit Python 3.3 die integrierte Möglichkeit, es zu tun:Warum verteilen und pip installieren zu meinem virtualenv ./local/bin?

$ python3.3 -m venv env 
$ source env/bin/activate 

An dieser Stelle python die Python in meinem virtualenv ist, was ich erwarten:

(env) $ which python 
/my_home_directory/env/bin/python 

Jetzt möchte ich installieren verteilen und Pip, so dass ich laden sie die Setup-Skripten und führen sie:

(env)$ wget http://python-distribute.org/distribute_setup.py 
(env)$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py 
(env)$ python distribute_setup.py 
(env)$ python get-pip.py 

Diese Befehle komplette succes süchtig. An diesem Punkt untersuche ich mein venv, um ein anderes Verzeichnis namens "local" zu finden, das vorher nicht da war. env/local/bin enthält meine easy_install und pip ausführbare Dateien, und sie sind immer noch auf meinem System vorhandene easy_install und Pip-aliased:

(env)$ ls env 
bin include lib local pyvenv.cfg 
(env)$ ls env/bin 
activate pydoc python python3 python3.3 
(env)$ ls env/local/bin 
easy_install easy_install-3.3 pip pip-3.3 
(env)$ which easy_install 
/usr/bin/easy_install 
(env)$ which pip 
/usr/bin/pip 

Ich glaube, dies ist eine Abkehr von Python 2.x Verhalten. An dieser Stelle erwarte ich easy_install und pip, die virtualenv Kopien zu verwenden, und ihre Verwendung, um Eier zu installieren, wird sie in den virtualenv setzen.

Geht ein bisschen weiter, ich knacken öffnen env/bin/aktivieren, um zu finden, dass env/bin dem Systempfad vorangestellt wird, aber env/local/bin nicht. Das erklärt das Verhalten, das ich sehe. Ich kann durch die Bearbeitung env/bin/aktivieren hinzuzufügen, um das env/local/bin auf dem Weg, so etwas wie dieses Problem umgehen:

_OLD_VIRTUAL_PATH="$PATH" 
PATH="$VIRTUAL_ENV/bin:$PATH" 
PATH="$VIRTUAL_ENV/local/bin:$PATH" # my new line 
export PATH 

Also, was ist denn hier los? Ist das ein Fehler, oder fehlt mir etwas?

Ich bin auf Ubuntu 12.10, falls das einen Unterschied macht.

+0

Ich dachte, der virtualenv sollte schon 'pip' /' easy_install' enthalten? – MattDMo

+0

Ungerade. Ich benutze einen persönlichen Build von Python 3.3 auf Debian und verteile/pip install in 'env/bin' für mich. Ist Ihre Kopie von 3.3 aus dem Ubuntu-Repository?Wenn dies der Fall ist, erstellen Sie eine lokale Kopie und prüfen Sie, ob das korrekt funktioniert. – eryksun

+4

@MattDMo Ich glaube, pip und easy_install sind enthalten, wenn Sie den 'virtualenv'-Befehl verwenden, aber das scheint nicht der Fall mit Python 3.3s venv-Modul zu sein, aus den Dokumenten zu urteilen. @eryksun Es ist in der Tat Ubuntu-Version von Python 3.3. Ich werde versuchen, lokal zu bauen und Bericht zu erstatten. –

Antwort

2

Ich habe das Gefühl, einen Fehler in Ubuntu Python-Pakete gibt es oder irgendwo verteilen ... aber ich habe es nicht aufgespürt (und ich Ich bin mir nicht sicher, ob es mich interessiert).

Aus irgendeinem Grund muss die VIRTUAL_ENV -Umgebungsvariable auf den Stamm des virtualenv gesetzt werden, damit distribute und pip ordnungsgemäß installiert werden können.

This gist, übernommen aus Vinay Sajips Codebeispiel in den Python 3-Dokumenten, legt die Variable fest; beide verteilen und Pip wird ordnungsgemäß installiert, wenn Sie es verwenden.

+0

Bestätigt: Wird VIRTUAL_ENV auf die Wurzel von virtualenv gesetzt, wird pip und distribute korrekt installiert. Ich habe das auf Ubuntu 13.04 getestet. Vielen Dank! –

0

Ich hatte das gleiche Problem. In activate Skriptdatei muss ich als erste Zeile (von cource nach #!...) hinzuzufügen:

unset PYTHON_PATH 
+3

Wenn Sie dies auf das Problem ausweiten können und warum Ihre Lösung funktioniert, wäre das besser. –

+0

Ich habe den gleichen Fehler .. aber wenn ich dies oben in dieser Datei hinzufügen, lösen Sie mein Problem ... Versuchen Sie es .. – WBAR

+1

Dies funktioniert nicht für mich. Auch mein env/bin/activate hat kein #! als erste Zeile. Wie ich in meinem Kommentar oben erwähnt habe, habe ich meine eigene Arbeit, indem ich env/bin/activate bearbeite, aber ich versuche herauszufinden, warum ein Workaround überhaupt notwendig ist. –

1

Es ist in den Python-docs.

'/ usr/local' ist die Standardeinstellung exec_prefix. Lesen Sie die venv docs für Details, wie Sie das Standardverhalten ändern können. Es gibt sogar ein Beispiel, das zeigt, wie man einen venv.EnvBuilder erstellt, der verteilt und Pip für Sie installiert.

, wenn Sie Dokumente verteilen finden, mich ;-) bitte wissen lassen

+0

Gute Information, danke. Wenn mein venv aktiviert ist, zeigen 'sys.prefix' und' sys.exec_prefix' beide auf den root des vents. Aber ich weiß nicht, wo in den Dokumenten erklärt wird, wie man 'pip' oder' easy_install' mit einem venv arbeitet. Genauer gesagt schaue ich in den ersten "Note" -Bereich der Venv-Dokumentation, der mir zu sagen scheint, dass die Dinge nur funktionieren sollten, wenn ich meine oben genannten Schritte mache. Speziell: "Natürlich müssen Sie sie zuerst in das venv installieren: Dies könnte durch Ausführen von distribute_setup.py mit aktiviertem venv und anschließendem Ausführen von easy_install pip erfolgen." Irgendeine Idee? –

Verwandte Themen