Zepsute odniesienia w Virtualenvs


238

Niedawno zainstalowałem na swoim komputerze Mac kilka plików dotfile wraz z kilkoma innymi aplikacjami (zmieniłem na iTerm zamiast Terminal i Sublime jako domyślny edytor tekstu), ale odtąd wszystkie moje środowiska wirtualne przestały działać, chociaż ich foldery w .virtualenvs nadal tam są i za każdym razem, gdy próbuję coś w nich uruchomić, zgłaszają następujący błąd:

dyld: Library not loaded: @executable_path/../.Python
  Referenced from: /Users/[user]/.virtualenvs/modclass/bin/python
  Reason: image not found
Trace/BPT trap: 5

Usunąłem wszystkie pliki związane z plikami kropkowymi i przywróciłem mój profil .bash do poprzedniego stanu, ale problem nadal występuje. Czy jest jakiś sposób na zdiagnozowanie problemu lub rozwiązanie go w prosty sposób (np. Bez konieczności ponownego tworzenia wszystkich wirtualnych wirtualnych programów)?



Dziękuję za komentarz, @unubtu. To z pewnością jest pomocne. Ale nie jestem też w stanie tworzyć nowych wirtualnych. My rmvirtualenvnadal działa, ale podczas próby uruchomienia mkvirtualenv, pojawia się następujący błąd: -bash: /usr/local/bin/virtualenv: /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/Resour: bad interpreter: No such file or directory Tak, wydaje się problem z moimi ścieżkami Pythona, ale nie mogę zobaczyć, gdzie jest problem, ponieważ mogę uruchomić Python i wydaje się w porządku.
oxtay

1
[aktualizacja] Mogłem znaleźć problem, ale nie jestem pewien i tak naprawdę nie jestem pewien, jak go naprawić. Wygląda na to, że wszystkie virtualenvpolecenia działają teraz teoretycznie, ale ponieważ istnieje problem z pythonem, nic nie robią. Tak więc prawdziwy problem dotyczy pytona Brew. Podejrzewam, że przyczyną jest zmiana nazwy w katalogach Pythona. Z jakiegoś powodu wszystkie te polecenia szukają Pythona w folderze, /usr/local/Cellar/python/2.7.6ale nazwa folderu jest w rzeczywistości /usr/local/Cellar/python/2.7.6_1.
oxtay

Ponieważ jestem nowicjuszem, nie wiem, jak ryzykowne jest ręczne zmienianie nazwy z 2.7.6_1 na 2.7.6 i sprawdzanie, co się stanie.
oxtay

Powinieneś być w stanie zmienić nazwę 2.7.6_1na 2.7.6. Jeśli gorzej stanie się najgorsze, możesz zmienić jego nazwę z powrotem.
unutbu

Odpowiedzi:


369

Tutaj znalazłem rozwiązanie problemu , więc cały kredyt należy się autorowi.

Istotą jest to, że podczas tworzenia virtualenv powstaje wiele dowiązań symbolicznych do zainstalowanego Pythona Homebrew.

Oto jeden przykład:

$ ls -la ~/.virtualenvs/my-virtual-env
...
lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python
...

Po uaktualnieniu Pythona za pomocą Homebrew, a następnie uruchomieniu brew cleanup, dowiązania symboliczne w virtualenv wskazują ścieżki, które już nie istnieją (ponieważ Homebrew je usunął).

Dowiązania symboliczne muszą wskazywać na nowo zainstalowany Python:

lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python

Rozwiązaniem jest usunięcie dowiązań symbolicznych w virtualenv, a następnie ich odtworzenie:

find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env

Prawdopodobnie najlepiej sprawdzić, które linki zostaną usunięte przed ich usunięciem:

find ~/.virtualenvs/my-virtual-env/ -type l

Moim zdaniem jeszcze lepiej jest usuwać tylko uszkodzone dowiązania symboliczne. Możesz to zrobić za pomocą GNU find:

gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete

Możesz zainstalować GNU findz Homebrew, jeśli jeszcze go nie masz:

brew install findutils

Zauważ, że domyślnie programy GNU instalowane z Homebrew zwykle mają literę g. Ma to na celu uniknięcie cieniowania pliku findbinarnego dostarczanego z systemem OS X.


4
+1 gfindbyło idealne, ponieważ miałem wiele nieprzerwanych dowiązań symbolicznych (np. Nodeenv), których nie chciałem usuwać
2Toad

3
Innym sposobem na usunięcie uszkodzonych dowiązań symbolicznych jest użycie standardowego find:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

Usunąłem cały katalog virtualenv. teraz nie mogę usunąć dowiązań symbolicznych. Żadne z rozwiązań wymienionych na tej stronie nie działa dla mnie na komputerze Mac. wciąż
pojawia

Te kroki nie do końca działały dla mnie:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
Wystarczy dodać, jeśli env był w Pythonie 2, uruchom go z argumentem: virtualenv ~/.virtualenvs/foo -p python2w przeciwnym razie użyje Python 3.
Bohumir Zamecnik

41

Po wypróbowaniu kilku rzeczy zadziałało to dla mnie:

przejdź do katalogu virtualenv (ale nie uruchamiaj workon):

cd ~/.virtualenv/name_of_broken_venv

Teraz usuń te pliki:

rm -rf .Python bin/python* lib/python2.7/* include/python2.7

Następnie, aby odbudować swój venv, uruchom:

virtualenv .
workon name_of_broken_venv
pip freeze

Powinieneś teraz ponownie zobaczyć listę zainstalowanych pakietów.


FWIW, właśnie wypróbowałem to podejście po aktualizacji do El Capitan i ponownej instalacji homebrew, a moja lista pakietów nie została zachowana.
Ryan

1
za pomocą pipenv można usunąć, wykonując pipenv --rmi odtwarzając ponownie pipenv shell,pipenv install
Harry Moreno

14

Stało się tak, gdy zaktualizowałem system Mac OS X Mavericks do systemu Snow Leopard. Musiałem też ponownie zainstalować napar. Mam nadzieję, że uruchomiłeś polecenie zamrażania dla swojego projektu za pomocą pip.

Aby rozwiązać ten problem, musisz zaktualizować ścieżki wskazane przez środowisko wirtualne.

  • Zainstaluj wersję Pythona za pomocą brew:

brew install python

  • Ponownie zainstaluj virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Usunięto stare środowisko wirtualne:

rmvirtualenv old_project

  • Utwórz nowe środowisko wirtualne:

mkvirtualenv new_project

  • Pracuj w nowym środowisku wirtualnym

workon new_project

  • Użyj pip, aby zainstalować wymagania dla nowego projektu.

pip install -r requirements.txt

To powinno opuścić projekt tak, jak było wcześniej.


To było jakiś czas temu i wydaje mi się, że w końcu zrobiłem coś w tym kierunku, ale ponieważ nie uruchomiłem wtedy „pip freeze> wymagania.txt”, nie było to najbardziej wydajne rozwiązanie. Wyciągnięta lekcja.
oxtay

13

Odpowiedź wersji aktualizacji @Chris Wedgwoodna utrzymanie site-packages(utrzymanie zainstalowanych pakietów)

cd ~/.virtualenv/name_of_broken_venv


mv lib/python2.7/site-packages ./    
rm -rf .Python bin lib include
virtualenv .
rm -rf lib/python2.7/site-packages
mv ./site-packages lib/python2.7/

1
To jest ponad doskonałość. Pomaga migrować wersję Pythona, zachowując wszystkie pakiety. Jeśli postępujesz zgodnie z tym, nie wykonuj instrukcji @Chris Wedgewood.
Harish Prasanna,

10

Wydaje się, że właściwym sposobem rozwiązania tego problemu jest uruchomienie

 pip install --upgrade virtualenv

po aktualizacji Pythona do Homebrew.

Powinna to być ogólna procedura dla każdej formuły instalującej coś takiego jak Python, który ma własny system zarządzania pakietami. Podczas instalacji brew install python, instalacji pythoni pipi easy_installi virtualenvi tak dalej. Tak więc, jeśli te narzędzia można samodzielnie zaktualizować, najlepiej spróbować to zrobić, zanim zaczniesz szukać Homebrew jako źródła problemów.


Działa to w przypadku problemu z setuptools, a konkretnie: Ostrzeżenie: nie można znaleźć lokalizacji svn dla setuptools == 0.6c12dev-r88846
Robert Brisita

1
Zastosowałem to rozwiązanie, a następnie uruchomiłem: virtualenv . w moim uszkodzonym środowisku wirtualnym. Zaktualizowana wersja virtualenvtego odtworzyła niezbędne zależności i byłam gotowa. Ten proces był bardziej samodzielny i bardziej solidny niż zaakceptowana dla mnie odpowiedź.
christang

W 2020 r. Jest to wciąż odpowiedź.
scubabuddha

7

Jeśli było to spowodowane przez brew upgradeaktualizację Pythona i nie możesz przejść do poprzedniej wersji, spróbuj brew switch python [previous version]np brew switch python 3.6.5. Stąd.


4

instrukcje virtualenvwrapper

Jak wskazano w zaakceptowanej odpowiedzi, główną przyczyną jest prawdopodobnie aktualizacja homebrew, co oznacza, że ​​twoje dowiązania symboliczne virtualenv wskazują na uszkodzone ścieżki pytona - zobacz szczegóły tutaj .

Dla każdej wirtualnej env należy ponownie przypisać dowiązania symboliczne, aby wskazywały prawidłową ścieżkę pytona (w piwnicy piwnej). Oto jak to zrobić za pomocą virtualenvwrapper . Tutaj aktualizuję wirtualną env o nazwie „my-example-env”.

cd ~/PYTHON_ENVS
find ./my-example-env -type l -delete
mkvirtualenv my-example-env

Wszystko gotowe.


4

Każdy, kto używa pipenv (i powinieneś!) Może po prostu użyć tych dwóch poleceń - bez aktywacji venv:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 

1
możesz również użyć pipenv --rmw folderze swojej env, a następniepipenv install --dev
Handfeger

2

Jeśli wyeliminowałeś Python3, po prostu spróbuj brew upgrade python3to naprawić.


2

Ostatnio miałem z tym problem. Żadne z powyższych rozwiązań nie działało dla mnie. Wygląda na to, że tak naprawdę nie był to problem Pythona. Kiedy działałem

aws s3 ls

, otrzymywałem następujący błąd:

dyld: Library not loaded: @executable_path/../.Python

Oznacza to, że awsplik wykonywalny biblioteki wskazuje, że albo nie istnieje, albo jest uszkodzony, dlatego odinstalowałem i ponownie zainstalowałem aws-cliinstrukcje z tego łącza i działało !!


2

Problem dla mnie (użytkownika MacOS) polega na tym, że brewzaktualizowałem łącza Python i virtualenvs do starej wersji, która została usunięta.

Możemy to sprawdzić i naprawić

>> ls -al ~/.virtualenvs/<your-virtual-env>/.Python
.Python -> /usr/local/Cellar/python/<old-version>/Frameworks/Python.framework/Versions/3.7/Python
>> rm ~/.virtualenvs/<your-virtual-env>/.Python
>> ln -s  /usr/local/Cellar/python/<new-version>/Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs/<your-virtual-env>/.Python

Działa to również w celu naprawy niedziałających łączy po zainstalowaniu Pythona 3.7 w systemie, w którym Python3.6
lukik

2

Miałem podobny problem i rozwiązałem go, po prostu odbudowując środowisko wirtualne virtualenv .


Witamy w SO. Chociaż dziękujemy za odpowiedź, byłoby lepiej, gdyby stanowiła dodatkową wartość oprócz innych odpowiedzi. W takim przypadku Twoja odpowiedź nie zapewnia dodatkowej wartości, ponieważ inny użytkownik już opublikował to rozwiązanie. Jeśli poprzednia odpowiedź była dla ciebie pomocna, powinieneś ją zagłosować, gdy będziesz mieć wystarczającą reputację
David Buck

1

Korzystanie z Python 2.7.10.

Wystarczy jedno polecenie virtualenv path-to-env. dokumentacja

$ virtualenv path-to-env
Overwriting path-to-env/lib/python2.7/orig-prefix.txt with new content
New python executable in path-to-env/bin/python2.7
Also creating executable in path-to-env/bin/python
Installing setuptools, pip, wheel...done.

1

Miałem zepsutą wirtualną env ze względu na ponowną instalację Homebrew Pythona (tym samym zepsute dowiązania symboliczne), a także kilka „sudo pip install”, które zrobiłem wcześniej. Wskazówki Weizhonga były bardzo pomocne w rozwiązywaniu problemów bez konieczności ponownej instalacji pakietów. Musiałem też wykonać następujące czynności dla problemu mieszanych uprawnień.

sudo chown -R moja_nazwa_użytkownika lib / python2.7 / site-packages


Jeśli uzupełniasz odpowiedzi innego użytkownika, zostaw mu komentarz, aby mógł edytować! Niezły wkład.
Francisco Peters

Nie ma wystarczającej liczby punktów reputacji, aby skomentować odpowiedź.
Tyler Smith,

1

Virtualenvs są zepsute. Czasami prostym sposobem jest usunięcie folderów venv i odtworzenie virutalenvs.


1

Jeśli używasz pipenv, samo działanie pipenv --rmrozwiązuje problem.



0

Przyjęta odpowiedź nie działa dla mnie: plik $WORKON_HOME/*/bin/python2.7nie jest już dowiązaniem symbolicznym, jest pełnowartościowym plikiem wykonywalnym:

$ file $WORKON_HOME/*/bin/python2.7
/Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64
...

Rozwiązaniem jest, niestety, całkowite usunięcie i ponowne utworzenie od podstaw wszystkich środowisk wirtualnych.

Dla odniesienia:

deactivate
pip install --user virtualenv virtualenvwrapper
pip install --user --upgrade virtualenv virtualenvwrapper
for ve in $(lsvirtualenv -b); do
  # assume that each VE is associated with a project
  # and the project has the requirements.txt file
  project=$(cat $WORKON_HOME/$ve/.project)
  rmvirtualenv $ve
  mkvirtualenv -a $project -r requirements.txt $ve
done

Myślę, że dzieje się tak, ponieważ to rozwiązanie nie jest przestarzałe - właśnie go wypróbowałem i naprawiłem mój problem. Myślę też, że jeśli nie masz dowiązań symbolicznych, nie zobaczysz opisanego tutaj błędu, więc ten komentarz nie staje się rozwiązaniem, ale rozprasza uwagę - tylko dlatego, że masz nowszą wersję, nie oznacza, że ​​wszyscy to robią. Tak sądzę, dlaczego głosowanie negatywne :)
RafazZ

@RafazZ: Mam nadzieję, że teraz jest lepiej. Zastanawiam się jednak, dlaczego wciąż jest to dowiązanie symboliczne. I tak, otrzymuję ten błąd, ponieważ python virtualenv jest połączony z bazowymi bibliotekami Pythona.
sds

Myślę, że domyślnym zachowaniem jest nadal tworzenie dowiązań symbolicznych i potrzebujesz --always-copyargumentu, aby je zastąpić. Przynajmniej to, co otrzymałem z Podręcznika użytkownika
RafazZ

@RafazZ: Nigdy nie korzystałem --always-copyi mam zwykłe pliki :-(
sds


0

Wypróbowałem kilka najlepszych metod, ale one nie działały, dla mnie, które próbowały sprawić, by toksyna działała. Ostatecznie zadziałało:

sudo pip install tox

nawet jeśli toksyna została już zainstalowana. Wyjście zakończyło się:

Successfully built filelock
Installing collected packages: py, pluggy, toml, filelock, tox
Successfully installed filelock-3.0.10 pluggy-0.11.0 py-1.8.0 toml-0.10.0 tox-3.9.0

0

Naprawiłem to po prostu odinstalowując python3 i pipenv, a następnie ponownie je instalując.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv

0

Wszystkie odpowiedzi są tutaj świetne, wypróbowałem kilka rozwiązań wspomnianych powyżej przez Ryana, Chrisa i nie mogłem rozwiązać problemu, więc musiałem postępować szybko i brudnie.

  1. rm -rf <project dir>(lub mv <project dir> <backup projct dir>jeśli chcesz zachować kopię zapasową)
  2. git clone <project git url>
  3. Pójść dalej!

Nie ma tu nic nowego, ale ułatwia życie!


0

Jestem pewien, że spóźniłem się na imprezę, ale chcę powiedzieć, że rozwiązanie tego problemu jest znacznie prostsze niż tutaj omówione.

Możesz łatwo zregenerować środowisko wirtualne bez konieczności usuwania / edytowania czegokolwiek. Zakładając, że wywoływane jest twoje uszkodzone środowisko env_to_fix, możesz po prostu wykonać następujące czynności:

mkvirtualenv env_to_fix

To zregeneruje łącza i naprawi środowisko bez konieczności zrzucania gdzieś bieżącego stanu i przywracania go.


0

Ten sam problem napotkałem, gdy wskazywałem czas działania Pythona od 2 do 3 na komputerze Mac, wskazując alias python na ścieżkę Python 3. Następnie odtwarzam nowy virtualenv i ponownie instaluję pakiety potrzebne do mojego projektu. W moim przypadku miałem program napisający w Pythonie, który pisze w arkuszu google. Wyczyść kilka pakietów, które różnią się od implementacji Pythona 2 i wa la, wszystko zaczęło działać ponownie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.