Odpowiedzi:
Czy używasz OS X i Homebrew? Strona Homebrew w języku Python https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md przedstawia znany problem z pip i obejście go.
Pracował dla mnie.
Możesz ustawić ten „pusty prefiks” jako domyślny, dodając plik ~ / .pydistutils.cfg o następującej zawartości:
[install] prefix=
Edycja: nie używaj tej zalecanej opcji Homebrew, spowoduje to przerwanie normalnych operacji pip .
pip install
operacje :(
--target
, nie psując domyślnego pip install
zachowania?
Uważam, że istnieje prostsze rozwiązanie tego problemu (Python firmy Homebrew na macOS), które nie zakłóci normalnych operacji pip.
Wszystko, co musisz zrobić, to utworzyć setup.cfg
plik w katalogu głównym projektu, zwykle tam, gdzie znajduje się główny __init__.py
lub wykonywalny plik py. Więc jeśli katalog główny twojego projektu to /path/to/my/project/
:, utwórz tam setup.cfg
plik i umieść w nim magiczne słowa:
[install]
prefix=
OK, teraz możesz uruchomić polecenia pip dla tego folderu:
pip install package -t /path/to/my/project/
To polecenie będzie działać z wdziękiem tylko dla tego folderu. Po prostu skopiuj setup.cfg
do innych projektów, które możesz mieć. Nie musisz pisać .pydistutils.cfg
w swoim katalogu domowym.
Po zainstalowaniu modułów możesz je usunąć setup.cfg
.
setup.cfg
części po instalacji. Spaliłem całe 2 dni, próbując dowiedzieć się, dlaczego moje środowisko virtualenv zostało zepsute, z błędami takimi jak Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'
. Usunięcie pliku instalacyjnego przywróciło mi zdrowie psychiczne
W systemie OSX (Mac) przy założeniu folderu projektu o nazwie / var / myproject
cd /var/myproject
setup.cfg
i dodaj
[install]
prefix=
pip install <packagename> -t .
-t .
zamiast przebywać poza katalogiem . U mnie ten sposób zadziałał, a drugi nie, choć nie mam pojęcia dlaczego.
Innym rozwiązaniem * dla użytkowników Homebrew jest po prostu użycie pliku virtualenv
.
Oczywiście może to i tak usunąć potrzebę katalogu docelowego - ale nawet jeśli nie, znalazłem, że --target
działa domyślnie (jak w, bez tworzenia / modyfikowania pliku konfiguracyjnego) w środowisku wirtualnym.
* Mówię rozwiązanie; może to tylko kolejna motywacja do skrupulatnego stosowania venvów ...
Występują błędy z innymi zaleceniami dookoła --install-option="--prefix=lib"
. Okazało się, że jedyne, co zadziałało, to używanie w PYTHONUSERBASE
sposób opisany tutaj .
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
to nie jest dokładnie to samo, co --target
, ale w każdym przypadku działa dla mnie.
Jak wspomniano wcześniej, jest to znany błąd występujący w pip & pythonie zainstalowanym z homebrew.
Jeśli utworzysz ~/.pydistutils.cfg
plik z instrukcją „pusty prefiks”, rozwiąże to problem, ale spowoduje przerwanie normalnych operacji pip.
Dopóki ten błąd nie zostanie oficjalnie usunięty, jedną z opcji byłoby utworzenie własnego skryptu bash, który będzie obsługiwał ten przypadek:
#!/bin/bash
name=''
target=''
while getopts 'n:t:' flag; do
case "${flag}" in
n) name="${OPTARG}" ;;
t) target="${OPTARG}" ;;
esac
done
if [ -z "$target" ];
then
echo "Target parameter must be provided"
exit 1
fi
if [ -z "$name" ];
then
echo "Name parameter must be provided"
exit 1
fi
# current workaround for homebrew bug
file=$HOME'/.pydistutils.cfg'
touch $file
/bin/cat <<EOM >$file
[install]
prefix=
EOM
# end of current workaround for homebrew bug
pip install -I $name --target $target
# current workaround for homebrew bug
rm -rf $file
# end of current workaround for homebrew bug
Ten skrypt opakowuje twoje polecenie i:
~/.pydistutils.cfg
plik z instrukcją „pusty prefiks”~/.pydistutils.cfg
plikTen skrypt można zmienić i dostosować do swoich potrzeb, ale masz pomysł. I pozwala na wykonywanie poleceń bez hamowania. Mam nadzieję, że to pomoże :)
Jeśli używasz virtualenv *, dobrym pomysłem może być dwukrotne sprawdzenie, which pip
czy używasz.
Jeśli zauważysz /usr/local/bin/pip
, że wydostałeś się ze swojego otoczenia. Ponowna aktywacja virtualenv naprawi ten problem:
VirtualEnv: $ source bin/activate
VirtualFish: $ vf activate [environ]
*: Używam virtualfish, ale zakładam, że ta wskazówka dotyczy obu.