2015-05-18 24 views
12

Używam virtualenv, aby zmienić mój python dev env. Ale kiedy biegnę workon my_env spotykam taką wiadomość o błędzie:dezaktywować konflikt w virtualenwwapper i anakonda

Error: deactivate must be sourced. Run 'source deactivate' 
instead of 'deactivate'. 

Usage: source deactivate 

removes the 'bin' directory of the environment activated with 'source 
activate' from PATH. 

Po kilku wyszukiwań w Google, wydaje się, że workon, który jest zdefiniowany w /usr/local/bin/virtualenvwrapper.sh wzywa deactivate. W skrzyni Anacondy znajduje się skrypt o tej samej nazwie, przez pomyłkę zostaje wywołany przez workon.

Wszelkie sugestie dotyczące rozwiązywania tego konfliktu?

Odpowiedz

3

Możesz edytować /usr/local/bin/virtualenvwrapper.sh, aby deactivate wskazywać na bezwzględną ścieżkę do tego, co deactivate ma przypominać.

+2

Gdzie jest prawo dezaktywować? Użyłem brew, aby zainstalować mój virtualenvwrapper. I jest tak wiele "dezaktywować" w /usr/local/bin/virtualenvwrapper.sh. Jakieś eleganckie rozwiązanie, aby zmienić to dezaktywować? – Scofield77

+0

virtualenvwrapper oczekuje, że dezaktywacja będzie funkcją powłoki, nie ma ścieżki do wskazania. – quodlibetor

15

Jednym z rozwiązań, które pracuje dla mnie jest, aby zmienić nazwę deactivate w kosza Anaconda za:

mv deactivate conda-deactivate

+0

Wybrałem to samo imię, zanim zobaczyłem tę odpowiedź. +1 dla "conda-deactivate" jako nowy standard! – vabada

+3

Jest to delikatne, ponieważ Conda również używa funkcji dezaktywacji w kilku miejscach. – FredrikHedman

1

w Anaconda activate jest wykonywalny skrypt znajduje się w katalogu anakonda bin, ale jest to funkcja w w virtualenvwrapper.sh. Jest to więc problem kolizji przestrzeni nazw, ale także przypadek nakładania się funkcji.

Anacondas to dystrybucja pytonów i - między innymi - ma wsparcie radzenia sobie ze środowiskiem wirtualnym poprzez conda env, podczas gdy virtualenvwrapper koncentruje się na pracy z różnymi środowiskami wirtualnymi. Po prostu zmiana nazwy skryptu anaconda/bin/activate jest kruchym rozwiązaniem i może zepsuć conda.

Kod virtualenvwrapper.sh (funkcja workon) wykonuje deactivate, który używa skryptu Anaconda. Ten skrypt zwraca błąd. Kod workon następnie włącza się i usuwa nazwę deactivate i źródła własnego deactivate, a także tworzy w locie funkcję deactivate.

Podsumowując, robi to, co trzeba, a "błąd" może być postrzegany bardziej jako ostrzeżenie. Jeśli chcesz, aby odejść można zmodyfikować funkcję workon (szukaj linii # Deactivate any current environment "destructively")

deactivate 
--> 
deactivate >/dev/null 2>&1 

(sugerowałem tę zmianę opiekuna virtualenvwrapper)

9

zgadzam się z komentarzem @ FredrikHedman, że zmiana nazwy skryptów w katalogu anaconda/miniconda bin może być kruchy. Jego pełny post doprowadził mnie do tego, co uważam za bardziej zdecydowaną odpowiedź. (Dzięki!)

Zamiast po prostu wyrzucać żadnych błędów generowane przez wywołanie deactivate, moglibyśmy po prostu warunkiem, że połączenie czy funkcja będzie nazywany kontra pliku. Jak wspomniano, virtualenv i virtualenvwrapper tworzą funkcję o nazwie deactivate; * condas wywołują plik skryptu o tej samej nazwie.

Więc w skrypcie virtualenvwrapper.sh, możemy zmienić następujące dwa wiersze, które test tego, czy deactivate jest jedynie wymagalne:

type deactivate >/dev/null 2>&1 
if [ $? -eq 0 ] 

ostrzejsze test, czy jest to funkcja powłoki:

nametype="$(type -t deactivate)" 
if [ "${nametype##* }" == "function" ] 

Ta zmiana pozwala uniknąć wyzwalania fałszywego błędu odnotowanego w pierwotnym pytaniu, ale nie grozi przekierowaniem innych przydatnych błędów lub wyjściem w ciche zapomnienie.

Zanotuj zmienne podstawienie na nametype w porównaniu. Wynika to z tego, że wyjście type -f pod zsh zwraca coś w stylu "name: type" w przeciwieństwie do bash, które zwraca po prostu "type". Substytucja usuwa wszystko do ostatniego znaku spacji, jeśli istnieją spacje, pozostawiając tylko wartość typu. To nieszkodliwie nie robi niczego w bash. (Byłbym bardzo podekscytowany, gdybym miał na ten temat wskazówki dotyczące kodowania).

Jak zawsze doceniam konstruktywne opinie i komentarze!

+0

Dzięki za to schludne obejście. – miku

+0

to działa, to rozwiązanie ma mój głos Zgadzam się, że conda może używać dezaktywacji na inne sposoby zmiana nazwy nie brzmi świetnie, niech condo sam !! –

1

Ponieważ nie mam wystarczająco dużo reputacji, aby dodać komentarz: Thomasa Capote'a sugestia jest w porządku (thx 4 that), z wyjątkiem „zsh” nie ma opcji „-t” dla build-in polecenie "typ". Dlatego konieczne jest dodanie kolejnej instrukcji warunkowej, aby uzyskać pożądany wynik dla "nametype":

# Anaconda workaround for "source deactivate" message: 
# Start of workaround: 
#type deactivate >/dev/null 2>&1 
#if [ $? -eq 0 ] 
if [ -n $ZSH_VERSION ] ; then 
    nametype="$(type -w deactivate)" 
else 
    nametype="$(type -t deactivate)" 
fi 
if [ "${nametype##* }" == "function" ] 
# End of workaround 

Mam nadzieję, że pomoże to innym użytkownikom systemu zsh.

+0

Możesz zaproponować zmianę oryginalnej odpowiedzi lub opublikować inną odpowiedź z wystarczającą ilością szczegółów, aby uzyskać pełną odpowiedź. Ale umieszczenie komentarza jako odpowiedzi zdecydowanie nie jest dobrym pomysłem. Nie oznaczałem Twojego posta, ponieważ nie uważam, że jest to komentarz, myślę, że można go zmienić jako odpowiedź. – Nima