sys.path.insert (1, path) 대신 sys.path.append (path)를 사용하는 이유는 무엇입니까?


88

편집 : Ulf Rompe의 의견에 따라 "0"대신 "1"을 사용하는 것이 중요합니다 . 그렇지 않으면 sys.path 가 중단 됩니다.

나는 지금 꽤 오랫동안 (1 년 이상) 파이썬을 해왔고, 사람들 sys.path.append()sys.path.insert(). 보여 드리겠습니다.

PyWorkbooks (내 컴퓨터에 설치됨)라는 모듈에서 작업하고 있지만 동시에 PyWorkbooks를 통합하는 다른 모듈 (PyJob이라고 가정 해 보겠습니다)에서 작업하고 있다고 가정 해 보겠습니다. PyJob에서 작업하는 동안 수정중인 PyWorkbooks에서 오류를 발견하므로 개발 버전을 가져오고 싶습니다.

둘 다 작업하는 방법은 여러 가지가 있지만 (예를 들어, PyWorkbooks 프로젝트를 PyJob 안에 넣을 수 있습니다), 때로는 여전히 경로를 가지고 플레이해야합니다. 그러나 PyWorkbooks가있는 폴더에 간단히 할 수는 없습니다sys.path.append() . 왜? 파이썬이 설치된 PyWorkbooks를 먼저 찾을 것이기 때문입니다!

이것이 sys.path.insert (1, path_to_dev_pyworkbooks)를 수행해야하는 이유입니다.

요약해서 말하자면:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

또는:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

이로 인해 과거에 저에게 몇 가지 중단이 발생했으며, (커뮤니티로서) sys.path.insert(1, path)수동으로 경로를 삽입하는 것처럼 추천하기 시작하면 정말 좋겠습니다. 원하는 경로라고 말하는 것이 안전하다고 생각합니다. 쓰다!

아니면 뭔가 잘못 되었나요? 때때로 저를 괴롭히는 질문이며 공개적으로 원했습니다!


3
해봤 sys.path.insert(1, dev_folder)지만 여전히 개발 모듈을 찾지 못하고 설치된 모듈 만 사용합니다. 이 문제를 어떻게 해결합니까?
endolith

답변:


47

패키지 / 모듈의 여러 버전이있는 경우 virtualenv (강조) 를 사용해야합니다 .

virtualenv 격리 된 Python 환경을 만드는 도구입니다.

해결되는 기본 문제는 종속성 및 버전 중 하나이며 간접적 인 권한입니다. LibFoo 버전 1이 필요한 응용 프로그램이 있지만 다른 응용 프로그램에는 버전 2가 필요하다고 가정 해보십시오.이 두 응용 프로그램을 어떻게 사용할 수 있습니까? 모든 것을 /usr/lib/python2.7/site-packages(또는 플랫폼의 표준 위치가 무엇이든) 설치 하면 업그레이드해서는 안되는 응용 프로그램을 실수로 업그레이드하는 상황에 빠지기 쉽습니다.

또는보다 일반적으로 응용 프로그램을 설치하고 그대로 두려면 어떻게 해야 합니까? 애플리케이션이 작동하는 경우 라이브러리 또는 해당 라이브러리 버전의 변경으로 인해 애플리케이션이 중단 될 수 있습니다.

또한 전역 site-packages디렉토리에 패키지를 설치할 수 없다면 어떻게해야 합니까? 예를 들어, 공유 호스트에서.

이 모든 경우에 virtualenv도움이 될 수 있습니다. 다른 virtualenv 환경과 라이브러리를 공유하지 않는 자체 설치 디렉토리가있는 환경을 생성합니다 (선택적으로 전역 적으로 설치된 라이브러리에도 액세스하지 않음).

이것이 사람들 insert(0, 이 틀렸다고 생각 하는 이유 입니다. 여러 환경을 관리하는 문제에 대한 불완전하고 임시 방편의 해결책입니다.


고마워요. 이런 존재는 막연하게 알고 있었지만 지금까지 실제로 확인하지 않았습니다. 그래서 제가해야 할 일은 가상 환경에서 인터프리터의 모든 것을 실행하는 것입니다. 감사!
Garrett Berg

1
이것은 (예를 들어, 내가 사용하지 않는 강력한 이유가 제안하지만 직접 질문에 대답하지 않는 virtualenv영업에 관련된 대답을 찾고 실제로와)
javadba

@javadba 귀하의 경우에는 사실 일 수 있지만이 질문을하는 대부분의 사람들은 venv.
AGF

46

정말로 sys.path.insert를 사용해야하는 경우 sys.path [0]을 그대로 두는 것이 좋습니다.

sys.path.insert(1, path_to_dev_pyworkbooks)

타사 코드가 sys.path 문서 준수 에 의존 할 수 있으므로 이것은 중요 할 수 있습니다 .

프로그램 시작시 초기화 된대로이 목록의 첫 번째 항목 인 path [0]은 Python 인터프리터를 호출하는 데 사용 된 스크립트를 포함하는 디렉토리입니다.


13

추가 및 앞에 추가의 개념을 혼동하고 있습니다. 다음 코드가 앞에 있습니다.

sys.path.insert(1,'/thePathToYourFolder/')

통역사가 통과 할 검색 순서의 시작 부분 (정확히 말하자면 두 번째)에 새 정보를 배치합니다. sys.path.append()검색 시퀀스의 맨 끝에 물건을 넣습니다.

virtualenv패키지 디렉토리를 PYTHONPATH매번 수동으로 코딩하는 대신 다음과 같은 것을 사용하는 것이 좋습니다 . 사이트 패키지와 가능한 Python 버전을 분리하는 다양한 생태계를 설정하려면 다음 두 블로그를 읽어보세요.

  1. 파이썬 생태계 소개

  2. 파이썬 가상 환경 부트 스트랩

환경 격리로 이동하기로 결정했다면 virtualenvwrapper ( http://www.doughellmann.com/docs/virtualenvwrapper/)를 살펴보면 확실히 이점을 얻을 수 있습니다 .


1
"파이썬 생태계 소개", "파이썬 가상 환경 부트 스트랩"링크는 폐기되었습니다. 활성화를 고려하십시오.
Pradeep Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.