Not: Bu soruna oldukça aşina iseniz doğrudan çözüme geçin
Bu, eski Python sürümümü 3.8 ile değiştiren Ubuntu 20.04’e yükselttiğimden beri son birkaç haftadır beni rahatsız eden bir sorunun nasıl çözüleceğine dair kısa bir yazı olacak.
Bilgisayarımda yıllar öncesine dayanan oluşturduğum Python projeleriyle dolu bir klasör var. Bağımlılıkları sanalenv’lerle izole etmeye çalışıyorum, ancak sürekli olarak yapmayı unuttuğum şey, her proje için kullandığım bağımlılıkları bir requirements.txt
dosya.
Virtualenv’lerin nasıl çalıştığına dair çok fazla ayrıntıya girmeyeceğim (bunların nasıl kullanılacağını kapsayan bu yazıya bakın), ancak esasen gereksinimler dosyası, Python paketi bağımlılıklarınızın taşınabilir bir listesidir ve projenizde kullanılan sürüm numaralarını içerir. . Bir dosyaya kaydedildiğinde, ortam dizini genellikle platforma özgü ikili dosyalar ve başka birinin bilgisayarında düzgün çalışmayabilecek şeyler içerdiğinden, bu genellikle ortamın kendisi yerine kaynak kontrolüne eklenir (örn. Sen Python’u yükledim).
Her durumda, Python sürümünüzü yükselttiğinizde ve ortamı “kaynakladığınızda” ilk başta herhangi bir sorun fark etmeyebilirsiniz. Kabuğunuzda doğru öneki alırsınız ve python
beklendiği gibi Python ortamına komut bağlantıları:
(env) user@PC:~/prg/py/elasticslurp$ which python
/home/user/prg/py/elasticslurp/env/bin/python
Ancak bu paketleri kullanan bir programı çalıştırmayı denediğinizde çalışmaz 🙁
(env) user@PC:~/prg/py/elasticslurp$ python main.py --help
Traceback (most recent call last):
File "main.py", line 2, in
from shodan import Shodan, APIError
ModuleNotFoundError: No module named 'shodan'
Hata! Sorun, her sanal ortamın Python’un belirli bir ana ve küçük sürümü (örneğin 3.6) için ayarlanmış olması ve en son sürümü (örneğin 3.8) desteklememesidir. Bu sorunla karşılaşırsanız bazı kritik dosyalar eksik olduğundan bağımlılıkları donduramazsınız bile:
(env) user@PC:~/prg/py/elasticslurp$ pip freeze
Traceback (most recent call last):
File "/home/user/prg/py/elasticslurp/env/bin/pip", line 7, in
from pip import main
ModuleNotFoundError: No module named 'pip'
Ortam dizinimizin yapısına bakalım ve bir sorun tespit edip edemeyeceğimizi görelim:
$ tree -L 2 env/
env/
├── bin
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── bitmath
│ ├── chardetect
│ ├── easy_install
│ ├── easy_install-3.6
│ ├── f2py
│ ├── f2py3
│ ├── f2py3.6
│ ├── pip
│ ├── pip3
│ ├── pip3.6
│ ├── __pycache__
│ ├── python -> python3
│ ├── python3 -> /usr/bin/python3
│ ├── shodan
│ ├── vba_extract.py
│ └── wheel
├── include
├── lib
│ └── python3.6 # <-- suspicious
├── lib64 -> lib
├── pyvenv.cfg
└── share
└── python-wheels
Kesinlikle Python’un eski sürümünden sonra etiketlenen birçok dosya var. Özellikle ortamın klasörü olan bir klasörü çağırdım. site-packages
yüklediğiniz tüm kitaplıkların bir kopyasını içeren dizin. Değiştirmemiz gereken şey bu.
Bu nedenle, yüklü kitaplıklarınızı kurtarmaya yetecek kadar bu sorunu çözmek oldukça basittir: eski lib klasörünü kendi Python sürümünüze uyacak şekilde yeniden adlandırın, örneğin:
$ mv env/lib/python3.6/ env/lib/python3.8
Şimdi bağımlılıklarınızı bir dosyaya dondurun:
$ pip freeze > requirements.txt
Gereksinimler dosyanızı hızlı bir şekilde kontrol edin ve doğru göründüğünden emin olun – Bununla ilgili henüz bir sorunla karşılaşmadım, ancak uç durumları kapsamlı bir şekilde test etmedim. Daha sonra eski ortamı atın ve mevcut Python sürümünüzle yeni bir ortam oluşturun:
$ deactivate # this closes all shell references to the Python virtualenv
$ rm -r env/
$ python3 -m venv env
Ve son olarak kütüphanelerinizi yükleyin:
$ source env/bin/activate
$ pip install -r requirements.txt
Bundan sonra programlarınız tekrar çalışmalıdır.