DistutilsOptionError : home 또는 prefix / exec-prefix를 제공해야합니다.


144

나는 보통 pip를 통해 파이썬 패키지를 설치했습니다.

Google App Engine의 경우 다른 대상 디렉토리에 패키지를 설치해야합니다.

난 노력 했어:

pip install -I flask-restful --target ./lib

그러나 그것은 실패합니다 :

home 또는 prefix / exec-prefix를 제공해야합니다.

이 기능을 작동 시키려면 어떻게해야합니까?

답변:


289

OS X 및 Homebrew를 사용하고 있습니까? 브루 파이썬 페이지 https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md이 핍과 주위에 작업 알려진 문제를 호출합니다.

나를 위해 일했다.

~ / .pydistutils.cfg 파일을 다음 내용으로 추가하여이 "빈 접두사"를 기본값으로 만들 수 있습니다.

[install]
prefix=

편집 : 이 Homebrew 권장 옵션을 사용하지 마십시오 . 정상적인 pip 작업이 중단됩니다 .


5
좋은 물건, 링크가 나쁘다, 이것은 내가 기대하는 새로운 것이다 : github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
patt0

6
그 파일은 가상 환경을 깨뜨 렸습니다.
Dmytro Sadovnychyi

16
이 빈 접두사 사업은 정상적인 pip install운영을 중단 합니다 :(
Jaap

10
기본 행동을 망치지 않고 허용 --target하는 방법을 아는 사람이 있습니까? pip install
ryantuck

3
더 이상 유효하지 않은 것 같습니다. 링크가 끊어지고 업데이트 된 링크가 pydistutils.cfg에 대해 이야기하지 않습니다
Lucretiel

164

정상적인 pip 작업을 중단하지 않는이 문제 (macOS에서 Homebrew의 Python)에 대한 간단한 해결책이 있다고 생각합니다.

setup.cfg프로젝트의 루트 디렉토리에 파일 을 작성하기 __init__.py만하면됩니다 ( 일반적으로 기본 또는 실행 파일 py 파일이있는 위치). 따라서 프로젝트의 루트 폴더가 : /path/to/my/project/인 경우 setup.cfg파일을 만들고 안에 마법의 단어를 넣으십시오.

[install]
prefix=  

이제 해당 폴더에 대한 pip 명령을 실행할 수 있습니다.

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

이 명령은 해당 폴더에 대해서만 정상적으로 실행됩니다. setup.cfg다른 프로젝트에 복사하십시오 . .pydistutils.cfg홈 디렉토리에 쓸 필요가 없습니다 .

모듈 설치가 완료되면를 제거 할 수 있습니다 setup.cfg .


2
이것은 pip3.6에서도 완벽하게 작동했습니다. 그리고 내 핍은 여전히 ​​손상되지 않았습니다.
한니발

10
이것이 정답입니다. 전역 핍 설정에 문제가 발생하지 않도록합니다.
TrinitronX

10
setup.cfg설치 후 제거 부분 에 중점둡니다 . 나는 2 일 동안 내 virtualenv 환경이 왜 망가 졌는지 알아 내려고 노력했습니다 Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'. 설치 파일을 제거하면 내 정신이 회복되었습니다
kip2

1
@ kip2 네, 당신이 올바르게 지적 했으므로 그 비트를 강조하기 위해 답을 편집했습니다. AndreG는주의하십시오.
bool.dev

주목 해 주셔서 감사합니다. "모듈 설치를 마친 후 setup.cfg를 제거해야합니다"라고 말하면 더 정확합니까?
AndreG

25

OSX (mac)에서 / var / myproject라는 프로젝트 폴더를 가정

  1. cd /var/myproject
  2. 라는 파일을 setup.cfg만들고 추가하십시오 [install] prefix=
  3. 운영 pip install <packagename> -t .

1
이것이 @AndreG 답변과 어떻게 다른지 잘 모르겠습니다.
Alastair McCormack

나에게 차이점은이 솔루션은 디렉토리에 있고 디렉토리 -t .외부에 머 무르지 않고 수행 한다는 것입니다. 이 방법은 저에게 효과적이며 다른 이유는 없었습니다.
척 윌버

12

Homebrew 사용자를위한 또 다른 솔루션 *은 단순히를 사용하는 것 virtualenv입니다.

물론, 그것은 어쨌든 대상 디렉토리의 필요성을 제거 할 수 있습니다 -그러나 그렇지 않은 경우에도 --target가상 환경에있을 때 기본적으로 (구성 파일을 작성 / 수정하지 않고) 기본적으로 작동하는 것을 발견 했습니다.


* 나는 해결책을 말한다; 아마도 그것은 venvs를 꼼꼼하게 사용하는 또 다른 동기 일 것입니다 ...


3
이게 한달 전일 뿐이라고 믿을 수 없어 내 자신의 질문에 스스로 대답하는 걸 발견했습니다. 미리 ...
OJFord

그래서, 최근 영업 이익의 질문에 문제가 있고, 단지 VIRTUALENV 나를 위해 문제를 해결 생성. 여전히 대상 디렉토리에 설치할 수 있습니다. python3도 설치했지만 virtualenv 솔루션의 경우 +1로 인해 문제가 추가로 복잡해졌습니다.
Josh Brown

3

주위의 다른 권장 사항으로 오류가 발생했습니다 --install-option="--prefix=lib". 내가 찾은 유일한 것은 여기에PYTHONUSERBASE 설명 된대로 사용 하는 입니다.

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

이것은와 정확히 동일 --target하지는 않지만 어쨌든 나를 위해 속임수를 사용합니다.


2

언급 한 바와 같이, 이것은 homebrew와 함께 설치된 pip & python의 알려진 버그입니다.

~/.pydistutils.cfg"빈 접두사"명령으로 파일 을 만들면 이 문제가 해결되지만 정상적인 pip 작업은 중단됩니다.

이 버그가 공식적으로 해결 될 때까지 옵션 중 하나는이 경우를 처리 할 고유 한 bash 스크립트를 작성하는 것입니다.

 #!/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

이 스크립트는 명령을 래핑하고 다음을 수행합니다.

  1. 이름 및 대상 매개 변수를 승인합니다
  2. 해당 매개 변수가 비어 있는지 확인
  3. ~/.pydistutils.cfg"빈 접두사"명령이 포함 된 파일을 만듭니다.
  4. 제공된 매개 변수로 pip 명령을 실행합니다
  5. ~/.pydistutils.cfg파일을 제거 합니다

이 스크립트는 필요에 따라 변경하고 조정할 수 있지만 아이디어를 얻을 수 있습니다. 그리고 그것은 핍을 제동하지 않고 명령을 실행할 수 있습니다. 그것이 도움이되기를 바랍니다 :)


2

virtualenv *를 사용하는 경우 사용중인 것을 다시 확인하는 것이 좋습니다 which pip.

당신은 /usr/local/bin/pip당신이 당신의 환경에서 깨진 같은 것을 본다면 . virtualenv를 다시 활성화하면 다음이 수정됩니다.

VirtualEnv : $ source bin/activate

VirtualFish : $ vf activate [environ]

* : 나는 virtualfish를 사용하지만이 팁은 둘 다와 관련이 있다고 가정합니다.


virtualenv를 사용하는 것은 실제로 비슷한 경우에 해결책이었습니다 :)
chriscatfr

-1

비슷한 문제가 있습니다. 상황에 대한 구체적인 사례를 설명하는 다른 스레드에서 여기 에 표시 할 때 오류를 피하기 위해 --system 플래그를 사용합니다 . 나는 같은 문제에 직면 한 사람을 도울 수 있다고 기대하면서 이것을 게시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.