외부 파이썬 라이브러리에 의존하는 플러그인 개발


29

Python 플러그인을 개발 중이며 대상은 'elevation'이라는 PyPI Python 라이브러리의 기능을 QGIS에 통합하고 있습니다.

외부 Python 라이브러리를 설치하고 Python 플러그인에서 사용할 수있게하는 OS 독립적 인 방법이 있습니까?

외부 파이썬 의존성을 설치하기위한 다른 시스템 특정 절차를 이미 알고 있습니다. 내가하고 싶은 일은 사람들을 미치게하지 않고 다른 환경에 플러그인을 배포하는 것입니다.

내가 이미 알고있는 것

웹 및 기타 유사한 질문을 검색하면 OS 독립적 인 솔루션이없는 것 같습니다.

Windows 사용자

Python은 QGIS 패키지에 패키지되어 배포되므로 외부 Python 라이브러리를 설치하려면 OSGeo4W Shell을 통해 거기서 pip를 사용해야합니다.

관련된 링크들:

OS X 사용자

이 경우 QGIS는 OS X에 사전 패키지되어 다음 위치에있는 내장 Python을 사용합니다.

/usr/bin/python

여기서 문제는 기본 설치된 pip에는 몇 가지 제한이 있으며 너무 많은 권한이 필요하다는 것입니다.

빠른 해결 방법은 home-brew를 사용하여 Python을 설치하여 pip가 사용자가 수정 가능한 Python 프레임 워크에 대해 실행할 수 있도록하는 것입니다. 이 방법에 대한 자세한 내용은 여기를 참조 하십시오 .

pip를 통해 모든 Python 라이브러리를 설치 한 후에는 디렉토리를 PATH 변수에 추가하면됩니다.

OS X 사용자를위한 대체 방법

플러그인 Python 코드 내에서 시스템이 제공하는 pip를 사용하여 필요한 패키지를 설치할 수 있습니다. 그런 다음 방금 설치 한 패키지를 경로에 추가하여 연결할 수 있도록 할 수 있습니다.

import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")

수제이지만 작동하는 솔루션 (Linux 및 OS X 모두에서 테스트)

라이브러리 업데이트와 유지 관리를 플러그인과 분리하여 유지할 수 있기 때문에 다른 방법으로 가기로 결정했습니다. 새로운 사용자가 플러그인을 설치할 때마다 최신 버전의 고도 라이브러리가 플러그인의 하위 디렉토리에 pip에 의해 직접 다운로드되어 설치됩니다.

self.plugin_dir = os.path.dirname(__file__)
self.elevation_dir = os.path.join(self.plugin_dir, 'elevation')

# Checking the presence of elevation library
try:
    import elevation
except:
    pip.main(['install', '--target=%s' % self.elevation_dir, 'elevation'])
    if self.elevation_dir not in sys.path:
        sys.path.append(self.elevation_dir)

유닉스 OS (리눅스, 맥 OS X)는 표준 파이썬 버전이 설치되어 사용하기 때문에이 절차는 Windows 용입니다
유전자

나는 그것을 알고, 나는 내 질문을 '풍부하게했다'고, 이제는 Mac에서 그것을하는 방법을 설명하는 OS X 사용자 섹션이 있습니다.
Engineer-G

1
Apple Python에서 pip를 완벽하게 설치할 수 있습니다. QGIS는 다른 버전 (Homebrew, Anaconda 및 기타)이 아닌이 버전을 사용합니다. Homebrew Python을 사용하려면 Homebrew 버전의 QGIS
유전자


3
순수한 파이썬 라이브러리 인 경우 플러그인을 하위 패키지 / 모듈로 사용하여 타사 라이브러리를 배포 할 수 있습니다.
user2856

답변:


2

외부 파이썬 라이브러리에 의존하는 QGIS에서 Python 스크립트를 실행하기 위해이 문제를 겪었습니다. 가장 간단한 해결책은 명령 행과 함께 제공되고 자체 파이썬을 설치하는 Boundless Desktop을 설치하는 것입니다. 커맨드 라인을 사용하면 외부 파이썬 패키지를 실행하고 (pip를 사용하여) 설치할 수 있습니다.


1

나는 최근에 프로젝트 에서이 작업을 조금했습니다. 불행히도 이것을 달성하는 좋은 방법은 없습니다. 귀하의 솔루션은 내가 생각해 낸 것과 매우 유사하지만 사용자가 pip를 설치했다고 보장하지는 않습니다.

나는 사본을 포함하여 결국 get_pip.py execfile ()을 사용하여 사용할 수없는 경우에 실행했습니다.

최종 솔루션과 유사합니다.

self.plugin_dir = os.path.dirname(__file__)

try:
    import pip
except:
    execfile(os.path.join(self.plugin_dir, get_pip.py))
    import pip
    # just in case the included version is old
    pip.main(['install','--upgrade','pip'])

try:
    import somelibrary
except:
    pip.main(['install', 'somelibrary'])

물론 대안은 플러그인 디렉토리에 라이브러리 자체를 포함시키는 것입니다. 이전 버전을 제공 할 위험이 있지만 이론적으로는 중요하지 않습니다.



1

이것은 나를 위해 일했다 (def run (self)) :

    def load_libraries(self):
        import_path = os.path.join(self.plugin_dir, 'lib/python2.7/site-packages')
        sys.path.insert(0, import_path)

그리고 virtualenv 설정.

Windows에서는 다른 이야기 인 것 같습니다. matplotlib를 설치하는 데 문제가있었습니다.

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