문맥
개인적 배경:
Python을 배우고 있으며 이를 NoSQL 데이터베이스의 자연어 처리에 적용하려는 Linux 경험이 없는 사용자입니다.
GNU/Linux를 선택하는 이유:
예산이 부족하고 기존 장치가 전혀 고장나지 않았지만 Windows가 가하는 부담을 감당할 수 없습니다. 한때 품질, 보증, 문서 및 우수한 애프터 서비스로 확고한 평판을 얻었던 제조업체의 새로운 최고급 워크스테이션에 돈을 투자해 보십시오. 비슷한 일을 겪었다이것. 더 이상 그러지 마세요. GNU/Linux는 사용자 정의가 가능하며 올바른 구성을 사용하면 매우 가볍습니다.
설정:
저는 이미 MX-19와 Fluxbox를 "데스크톱 환경"으로 실행하고 다른 하나는 Fedora 34와 LXQT를 실행하고 있습니다. 제가 아는 한 Arch나 Gentoo를 사용하여 또 다른 환경을 설정하는 것을 고려하고 있습니다. 이것을 설치하면 UNIX와 유사한 아키텍처를 꽤 잘 이해할 수 있고 실제로 내 컴퓨터에 맞게 조정할 수 있습니다. Sam Vimes가 Lady Sybil과 사랑에 빠진 것처럼 저는 Linux와 사랑에 빠졌습니다. 처음에는 제가 얻을 수 있는 것에 만족했지만, 더 많이 배울수록 더 사랑에 빠졌습니다.
하지만 완전히 갈등이 없는 것은 아니며 말장난을 의도한 것도 아닙니다.
GNU/Linux 배포판의 문제는 Python의 문제를 복잡하게 만듭니다:
필요에 따라 사용하는 대부분의 애플리케이션과 라이브러리는 Python 기반 패키지이지만 배포판의 승인된 리포지토리에 항상 포함되지는 않으며 항상 최신 상태도 아닙니다(포함된 경우).
내 작업 외에도 이는 내가 가장 좋아하는 ProtonVPN 클라이언트 및 ProtonMail 브리지에도 적용됩니다. 나는 내가 소유한 모든 시스템에 이를 설치합니다. Windows와 Android에서는 간단합니다. Debian과 Fedora는 모두 rpm을 지원하지만 포크 배포판은 반드시 그렇게 할 필요는 없습니다. 그래서 저는 차선책을 취해야 했습니다.
PyPI에서 설치하고 소스에서 설치:
그래서 저는 PyPI를 사용하여 설치해왔습니다.
pyton3 -m pip install <packagename>
소프트웨어 제조업체가 PyPI 사본을 업데이트하지 않거나 소프트웨어 중 하나만 업데이트하고 다른 소프트웨어는 업데이트하지 않고 둘 다 동일한 라이브러리의 다른 버전에 의존하는 경우 종속성 충돌이 발생합니다... 음, 시작해야 합니다. 소스 코드 컴파일. git, cd를 소스 루트에 복제하고 다음을 실행했습니다.
pyton3 -m pip install .
종속성 관리 문제: Python 및 pip의 특수한 경우:
- 올해는 Python 2.7과 Python 3 사이의 고통스러운 전환이었습니다... 우리는 9에 도달했고, 11이 곧 출시될 예정입니다. pip는 똑같이 자주 업데이트되며 최신이 아닌 경우 지속적으로 경고할 것입니다.
- 동시에, 많은 개발자들은 지나치게 엄격한 요구 사항을 가지고 있습니다. "내 소프트웨어에는 이 패키지의 특정 버전이 필요합니다. '이후', 아니오, 이 버전이 아닙니다." 또는 "이보다 최신이 아닙니다." 일반적인 해결 방법: 가상 환경을 사용합니다. 두 가지 질문이 있습니다:
- 각 패키지에 대한 가상 환경을 설정하는 것은 추적 및 관리가 어려웠고, 기존 장치에는 드라이브와 RAM이 제한되어 가볍게 사용할 수 없었습니다.
- 가상 환경에 넣을 패키지와 가상 환경에 넣지 않을 패키지를 결정하는 것 자체가 시간이 많이 걸리는 문제입니다.
- venv를 사용하더라도 패키지의 종속성 트리에 모순이 있으면 무한 루프에 빠질 수 있습니다. 여기서 pip는 다른 패키지의 다운그레이드가 필요한 한 패키지의 업그레이드를 설치하고 pip는 차례로 업그레이드를 원합니다. 첫 번째와 동일 등등
- 예를 들어, 패키지의 RequirementA < 2.1.5 및 RequirementB >2.3이 있지만 2.1.5 이전 버전의 A에는 C < 4.1이 필요하고, B > 2.4의 버전에는 C > 5.2가 필요합니다. C는 > 5.2 및 < 4.1일 수 없습니다. 그것은 될 수있다약간의 코미디 루틴입니다.
올바른 질문:
지금까지 효과가 있을 것 같은 뭔가를 생각해냈는데, 이에 대한 답글을 아래에 게시할 예정이지만, 잘 하고 있는지 잘 모르겠습니다. 일부 bash 스크립트, 파이프, 정규식을 사용하여 자동화하기 쉬워야 합니다. 그러나 이 특정 접근 방식을 적용하고 체계화하기 전에 숙련된 Linux 사용자의 의견을 듣고 싶습니다. 귀하의 재량에 따라 방법은 무엇입니까?
a) GNU/Linux의 고유한 장점을 이상적으로 활용하는 동시에
b) 사용될 수 있는 특정 배포판을 건드리지 않고
c) 알고리즘적으로 건전하고 안전하게 수행할 수 있으며 d) 무인 업그레이드를 합리적으로 자동화할 수 있으며 e) 이를 확인할까요? 도중에 오류가 발생하면 다시 가져오도록 허용하시겠습니까?
- 특히 소스에서 설치하는 경우 PyPl에서 필요한 종속성을 가져와야 하는 경우가 많습니다.
답변1
임시 해결책:
많은 시행착오와 pip를 sudo로 사용하여 배포판 중 하나를 돌이킬 수 없을 정도로 깨뜨린 끝에 마침내 방법을 찾았습니다. pip 옵션에 대한 도움말 가이드를 탐색하면서 이 경로를 따를 수 있고 문제가 발생하지 않는다는 것을 알았습니다.하지만:
업그레이드 가능한 모든 패키지를 확인하세요.
python3 -m pip list --outdated --verbose
모든 요구사항 충돌을 확인하세요.
python3 -m pip check --verbose
패키지가 필수 버전보다 오래되었거나 전혀 설치되어 있지 않아 요구 사항이 충돌하는 경우도 있으므로 설치해 주시기 바랍니다.의존성 없음,그런 다음 2로 돌아갑니다. 요구 사항에 비해 너무 새로운 설치된 패키지로 인해 모든 요구 사항 충돌이 발생하는 경우 4단계로 이동하세요.
python3 -m pip install --no-dependencies --verbose <package-name>
1단계를 다시 확인하고 업그레이드 가능한 패키지를 업그레이드하세요.종속성 없음, 그런 다음 4단계로 돌아갈 때까지 2~3단계의 주기를 반복합니다. 이 더 넓은 주기는 a) 더 이상 업그레이드할 수 있는 패키지가 없을 때, b) 설치된 패키지의 모든 필수 종속성이 설치되어 있고 충분히 최근 버전일 때 또는 - "너무 새로운" 상태일 때까지 반복됩니다.
오늘은 여기까지입니다. 다음 작업으로 넘어갑니다.
a) 이로 인해 문제가 발생하고 시스템이 손상될 수 있는지, b) 이 간단한 알고리즘을 루프에 안전하게 작성할 수 있는지 궁금합니다.
오류를 역추적하는 능력:
어느 주에서 왕복 여행이 필요한지는 아직 모르지만, 그곳에 있을 것이라는 것은 알고 있습니다.
그렇기 때문에 위에서 작성한 모든 명령은 --verbose이므로 수집할 수 있는 모든 정보(필요한 것보다 더 많은 정보)가 기록에 저장할 수 있도록 콘솔에 표시됩니다. 지금까지 열심히 마무리했어요
history >> ~/Documents/shell_histories/2021_mm_dd_pip_<upgrades,sourceinstalls,etc.>.txt
하지만 아직 이 로그를 어떻게 처리해야 할지 모르겠습니다.
어떤 제안이 있나요? 내 접근 방식이 올바른가요, 아니면 무모한가요? 어쨌든, 어떻게 하면 더 잘할 수 있을까요?