pip를 사용하여 로컬 파일 시스템 폴더에서 virtualenv로 Python 패키지 설치


346

로컬 파일 시스템에서 pip를 사용하여 패키지를 설치할 수 있습니까?

python setup.py sdist적절한 tar.gz 파일을 만든 패키지를 실행 했습니다. 이 파일은 내 시스템의에 저장됩니다 /srv/pkg/mypackage/mypackage-0.1.0.tar.gz.

이제 가상 환경에서 pypi 또는 특정 로컬 위치에서 패키지를 설치하고 싶습니다 /srv/pkg.

이게 가능해?

추신 : 나는 내가 지정할 수 있음을 알고있다 pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz. 작동하지만 /srv/pkgpip를 입력하면 검색 할 다른 장소로 위치를 사용하는 것에 대해 이야기하고 있습니다 pip install mypackage.


WHL 휠에서 setup.py없이 PyPi 패키지를 설치하려고했는데 Python 버전에 맞는 올바른 버전을 다운로드 한 후 설치했습니다 pip install <Path-to-WHL-file>.
Wiktor Stribiżew

답변:


136

나는 당신이 찾고있는 것이 --find-links옵션 이라고 확신합니다 .

index.html모든 패키지에 대한 링크를 나열하는 로컬 패키지 색인에 대한 더미를 생성해야 할 수도 있습니다 . 이 도구는 다음을 도와줍니다.

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage작동해야합니다.
jfs

1
도움이됩니다. 그리고 pip의 -i 옵션을 사용 하여 로컬 PyPI로 취급 할 수 있습니다 .
diabloneo 2016 년

등가 easy_install을 명령입니다easy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
윌프레드 휴즈

소스 배포 파일은 프로젝트 나 패키지 디렉토리를 가리 키기 만하는 것이 아니라 작동하기 전에 만들어야했습니다. 이것은 나를 넘어 뜨렸다. docs.python.org/3.6/distutils/sourcedist.html
Josh

3
--find-links패키지가 지정된 위치에 또는 새 버전을 사용할 수있는 경우 발견되지 않는 경우 여전히 PyPI에서 검색을 허용합니다. Windows에서는 이것을 --only-binary=packagename(또는 --only-binary=:all:) 와 결합하는 것이 매우 유용하다는 것을 알았습니다 . 이것은 pip가 PyPI에 소스 배포 만 있고 컴파일이 필요한 기본 종속성을 가진 패키지를 다운로드하려고 시도하지 못하게하므로 디렉토리에서 설치해야하는 가장 일반적인 이유입니다. 와 달리 PyPI에서 다른 패키지를 --no-index계속 설치할 수 있습니다 .
jpmc26

463

이건 어떤가요::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

예를 들어 pip install -e /srv/pkg

여기서 / srv / pkg는 'setup.py'를 찾을 수있는 최상위 디렉토리입니다.


49
그러면 패키지가 개발 모드로 설치되므로 소스가있는 위치로 다시 연결됩니다. 우연히 소스가 이동되거나 삭제되면 패키지 가져 오기가 실패합니다.
Trasplazio Garzuglio 2016 년

3
@MarcoDinacci 흥미로운 점 --editable은 로컬 패키지의 디렉토리를 살펴보고 소스가 git repo 인 경우 폴더보다 약간 유연하다는 것입니다. 그래도 이것에 대한 문서를 찾을 수 없습니다.
NotSimon

3
이것은 특정 패키지, 특히 로컬 컴퓨터 또는 VCS url에 현재 / 집중적 인 개발 패키지를 설치하는 데 적합합니다. 하나의 특정 패키지 소스가 아닌 모든 로컬 패키지 소스의 상위 디렉토리를 검색하는 것에 대한 질문에는 대답하지 않습니다 . 허용 된 답변은 여러 패키지가있는 디렉토리 또는 URL이있을 때 작동합니다.
Gavin

@MarcoDinacci 그러나 사용자가 코드를 다운로드한다고 가정하자. 그들은 지능적이라면 프로그램을 원하는 곳에 두었습니다. 그들은 왜 그것을 옮기고 싶습니까?
Zelphir Kaltstahl

1
@Simon은 pip에게 git repo를 찾지 말라고 알려주는 방법이 있습니까? 나는 경우 do pip install -e가 원격 자식의 코드를 체크 아웃, 나는 (원격에서 아직 변경) 그대로 코드를 설치하고 싶습니다.
Pedru

39

설치 pyfuzzy중이지만 PyPI에 없습니다. 메시지를 반환합니다 : No matching distribution found for pyfuzzy.

나는 대답을 시도했다

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

그러나 작동하지 않으며 다음 오류를 반환합니다.

인덱스 무시 : https://pypi.python.org/simple pyfuzzy 수집 pyfuzzy 요구 사항을 충족하는 버전을 찾을 수 없습니다 (버전에서 :) pyfuzzy에 대해 일치하는 분포가 없습니다.

마침내 나는 거기에 간단한 좋은 방법을 찾았습니다 : https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

그래서 다음 명령이 나를 위해 일했습니다.

pip install ../pyfuzzy-0.1.0.tar.gz.

그것이 당신을 도울 수 있기를 바랍니다.


4
이것은 나를 위해 일했습니다. 다른 접근 방식을 시도했지만 Could not find a version that satisfies오류 로 우연히 발견되었습니다 . 감사.
Rair

21

이것이 내가 사용한 해결책입니다.

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

나는 이것을 pip 설치 예제다른 질문에 대한 Rikard의 답변 에서 함께 정리했습니다 . "--pre"인수를 사용하면 비 프로덕션 버전을 설치할 수 있습니다. "--no-index"인수는 PyPI 인덱스를 검색하지 않습니다. "--find-links =." 로컬 폴더에서 인수를 검색합니다 (상대적이거나 절대적 일 수 있음). 디버깅을 위해 "--log-file", "log.txt"및 "-vv"인수를 사용했습니다. "-업그레이드"인수를 사용하면 이전 버전보다 최신 버전을 설치할 수 있습니다.

또한 제거하는 좋은 방법을 찾았습니다. 이것은 여러 다른 파이썬 환경이있을 때 유용합니다. 의도하지 않은 설치 제거를 방지하기위한 안전 조치와 함께 "install"대신 "uninstall"을 사용하는 것과 동일한 기본 형식입니다.

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

로컬 폴더에는 install.py, uninstall.py, mypackagename-1.0.zip 파일이 있습니다.


1
감사. "--find-links =." 그리고 "--no-index", 여기서 유틸리티 패키지 안에 파이썬 스크립트를 붙이는 열쇠는 사이트 패키지에서 이전 버전 패키지를 제거한 다음 하위 디렉토리에서 tar.gz의 패키지를 설치합니다. 유틸리티 패키지 폴더 (--find-links =.에 대해 몰랐다)를 찾은 다음 휠을 작성하고 설치합니다. 플럼 범과 클릭을 통해 모두 자동화됩니다. 누군가 원한다면 링크를 게시합니다. 공감.
JackLeEmmerdeur

15

--find-links 옵션 은 작업을 수행하며 requirements.txt파일 에서 작동 합니다!

패키지 아카이브를 일부 폴더에 넣고 요구 사항 파일을 변경하지 않고 최신 폴더를 가져올 수 있습니다. 예를 들면 requirements다음과 같습니다.

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

이제 requirements/base.txt넣어 :

--find-links=requirements
foo_bar
wiz_bang>=0.8

독점 패키지를 업데이트하는 깔끔한 방법

이런 식으로 local folderAND pypi에서 동일한 단일 호출로 패키지를 설치할 수 있습니다 .pip install -r requirements/production.txt

추신. 내보기 cookiecutter - djangopackage 기반 요구 사항 조직 폴더 요구 사항 및 사용을 분할하는 방법을 볼 포크.


고마워, 이것은 내가 생각했던 것보다 훨씬 좋습니다!
FoundNil

12

로부터 설치 - 패키지 페이지에서 간단히 실행할 수 있습니다 :

pip 설치 / srv / pkg / mypackage

여기서 / srv / pkg / mypackagesetup.py를 포함하는 디렉토리 입니다.


또한 1 , 아카이브 파일에서 설치할 수 있습니다.

pip install ./mypackage-1.0.4.tar.gz

1 질문에 언급되었지만 인기로 인해 포함되어 있습니다.


2
이것이 기본 답변이어야합니다. 패키지가 로컬 컴퓨터의 어디에 있는지 정확히 알고 있다면 --find-links를 사용하여 핍을 찾을 필요가 없습니다.
Robert

6

virtualenv와 requirements.txt파일 이 있다고 가정하면 이 파일 내부에서 패키지를 가져올 위치를 정의 할 수 있습니다.

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

디렉토리 내 requirements.txtegg_dir디렉토리로 요구 사항 보유

로컬 캐시를 빌드 할 수 있습니다.

$ pip download -r requirements.txt -d eggs_dir

그런 다음 "캐시"를 사용하는 것은 간단합니다 :

$ pip install -r requirements.txt --find-links=eggs_dir


1

로컬에서만 설치하려면 두 가지 옵션이 필요합니다.

  • --find-links: 종속성을 찾을 위치. file://다른 사람이 언급 한 접두사 가 필요하지 않습니다 .
  • --no-index: pypi 색인에서 누락 된 종속성 (종속성이 설치되어 있지 않고 --find-links경로에 있지 않음)을 찾지 마십시오 .

따라서 모든 폴더에서 다음을 실행할 수 있습니다.

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

mypackage가 올바르게 설정되면 모든 종속성이 나열되고 pip download를 사용하여 종속 항목 (예 : depencies의 종속성 등)을 다운로드하면 모든 것이 작동합니다.

액세스 가능한 경우 pypi 색인을 사용하고 싶지만 로컬 휠로 대체하려는 경우을 제거 --no-index하고 추가 할 수 있습니다 --retries 0. 누락 된 종속성 (설치되지 않은)에 대해 pypi를 확인하려고 시도하는 동안 pip가 잠시 멈추는 것을 볼 수 있으며 도달 할 수없는 경우 로컬로 돌아갑니다. pip에게 "로컬을 먼저 찾은 다음 색인을 찾도록"하는 방법은없는 것 같습니다.


-1

나는 정말 간단하고 비참하게 실패한 것을 달성하려고 노력하고 있습니다. 어쩌면 나는 바보입니다.

어쨌든, Dockerfile파이썬 패키지 zip 파일을 다운로드 하는 스크립트가 있고 (예 : GitHub에서) 설치하려는 file:///경우 다음 예제 와 같이 접두사를 사용하여 설치할 수 있습니다 .

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

참고 : 패키지를 사용하여 즉시 설치할 수 있다는 것을 알고 pip install https://example.com/mypackage.zip있지만 필자의 경우 체크섬을 확인하고 싶었습니다. (파라노이드는 충분하지 않습니다) pip가 제공하는 다양한 옵션 / #md5조각 을 사용하려고 할 때 비참하게 실패했습니다 .

를 사용하여 직접 간단한 작업을 수행하는 것은 놀랍게도 실망 스러웠습니다 pip. 체크섬을 전달 pip하고 zip을 설치 하기 전에 일치하는지 확인 하고 싶었 습니다.

나는 아마도 매우 어리석은 짓을하고 있었지만 결국 포기하고 이것을 선택했습니다. 다른 사람들이 비슷한 것을 시도하는 데 도움이되기를 바랍니다.

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