DistutilsOptionError: must supply either home or prefix / exec-prefix-not both

Zazwyczaj instalowałem Pakiety Pythona przez pip.

Dla Google App Engine, muszę zainstalować pakiety do innego katalogu docelowego.

Próbowałem:

Pip install-I-restful --target ./ lib

Ale zawodzi z:

Must supply either home or prefix / exec-prefix -- not both

Jak mogę to uruchomić?

Author: Rob Bednark, 2014-06-17

8 answers

Czy używasz OS X i Homebrew? Strona Pythona Homebrew https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md wywołuje znany problem z pip i obejściem.

Zadziałało dla mnie.

Możesz ustawić ten" pusty prefiks " jako domyślny, dodając ~/.pydistutils.plik cfg o następującej treści:

[install]
prefix=

Edit: nie używaj tej zalecanej opcji Homebrew, to złamie normalny pip operacje .

 209
Author: ayvazj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 14:11:13

Wierzę, że istnieje prostsze rozwiązanie tego problemu (Python Homebrew na macOS), które nie złamie 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. Jeśli więc głównym folderem twojego projektu jest: /path/to/my/project/, Utwórz tam plik setup.cfg i umieść magiczne słowa:

[install]
prefix=  

OK, teraz będziesz mógł uruchomić polecenia Pipa dla tego folderu:

pip install package -t /path/to/my/project/  

To polecenie będzie uruchamiane tylko dla tego folderu. Po prostu skopiuj setup.cfg do innych projektów, które możesz mieć. Nie trzeba pisać .pydistutils.cfg w katalogu domowym. Po zakończeniu instalacji modułów możesz usunąć setup.cfg.

 61
Author: AndreG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 19:34:32

Innym rozwiązaniem * dla użytkowników Homebrew jest po prostu użycie virtualenv.

Oczywiście, że Może usunąć potrzebę katalogu docelowego - ale nawet jeśli nie, znalazłem --target działa domyślnie (jak w, bez tworzenia/modyfikowania pliku konfiguracyjnego), gdy w środowisku wirtualnym.


* mówię rozwiązanie; może to tylko kolejna motywacja do skrupulatnego korzystania z venvs...

 10
Author: OJFord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-05 16:22:37

Na OSX (mac), zakładając folder projektu o nazwie /var/myproject

  1. cd /var/myproject
  2. Utwórz plik o nazwie setup.cfg i dodaj [install] prefix=
  3. Run pip install <packagename> -t .
 8
Author: Jerome Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 05:43:46

Trafiłem błędy z innymi zaleceniami wokół --install-option="--prefix=lib". Jedyne co znalazłem to użycie PYTHONUSERBASE zgodnie z opisem tutaj .

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

To nie jest dokładnie to samo, co --target, ale to działa na moją korzyść w każdym razie.

 2
Author: Imran Rashid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:51

Jak wspomniano, jest to znany błąd z pip & python zainstalowany z homebrew.

Jeśli utworzysz plik ~/.pydistutils.cfg z instrukcją "empty prefix", naprawi to ten problem, ale złamie normalne operacje pip.

Dopóki ten błąd nie zostanie oficjalnie rozwiązany, jedną z opcji będzie utworzenie własnego skryptu bash, który obsłuży 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 zawija Twoje polecenie i:

  1. akceptuje nazwę i parametry docelowe
  2. sprawdza, czy te parametry są puste
  3. tworzy ~/.pydistutils.cfg Plik z instrukcją "empty prefix"
  4. wykonuje polecenie pip z podanymi parametrami
  5. usuwa ~/.pydistutils.cfg plik

Ten skrypt można zmienić i dostosować do swoich potrzeb, ale masz pomysł. I pozwala na uruchomienie polecenia bez hamowania pip. Mam nadzieję, że to pomoże:)

 1
Author: Vedran Stankovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 13:14:15

Jeśli używasz virtualenv*, dobrym pomysłem może być podwójne sprawdzenie which pip używasz.

Jeśli widzisz coś w rodzaju /usr/local/bin/pip wyrwałeś się ze swojego otoczenia. Reaktywacja virtualenv to naprawi:

VirtualEnv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: używam virtualfish, ale zakładam, że ta wskazówka dotyczy obu.

 0
Author: Graham P Heath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 19:17:24

Mam podobny problem. Używam flagi --system, aby uniknąć błędu, jak opisuję tutaj w innym wątku, gdzie wyjaśniam konkretny przypadek mojej sytuacji. Zamieszczam to tutaj oczekując, że może pomóc każdemu stojącemu przed tym samym problemem.

 -1
Author: pipelog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 00:02:57