یک میرور کوچک از کتاب‌خانه‌های پایتونی

python

یکی از مشکلاتی که خیلی وقت‌ها با اون مواجه می‌شوم. مشکل دانلود فایل‌های کتابخونه‌هایی است که استفاده می‌کنم. مشکل از اونجایی است که گاهی حجم این‌ها زیاد است و مشکل بزرگتر هم سرعت اینترنت در ایران است. از این رو توی این پست میخوام راه کاری که برای پایتون (Python) بهش رسیدم رو توضیح بدم.

نکته اول اینکه لازم است یک سرور محلی برای خودتون درست کنید برای این منظور هم کتابخونه pypi-server رو پیشنهاد می‌دهم. بعد از نصب این ابزار (یک کتابخونه پاتونی است) کافیه که بهش پوشه حاوی فایل های whl خودتون رو بدید.

# install from 
## https://pypi.org/project/pypi-server/
pypi-server run -p 8091 /$HOME/whlRepo

طبق دستور بالا من از دایرکتوری whlRepo که توی دارکتوری اصلی کاربر ساختم استفاده میکنم و روی پرت 9081 یک سرور محلی بالا میارم. حالا چطور ازش استفاده کنم؟ گام اول اینکه یه سری کتابخونه توش دانلود کنید و البته هر بار می‌خواهید نصب کنید اول دانلود کنید، حالا چطور؟

pip download --extra-index-url http://localhost:8091 -d /$HOME/whlRepo <packages name>

با دستور بالا فایل های مربوطه توی دایرکتوری گفته شده دانلود می‌شوند. نکته جالب اینکه اول توی خود ریپازیتوری سرچ میکنه و اگه نبود میره از اینترنت دانلود می‌کنه. بعد از اینکه دانلود تموم شد می‌تونید با دستور زیر نصب رو انجام بدید

pip install --extra-index-url http://localhost:8091  <packages name>

حالا یه نکته ریز دیگه می‌مونه و اونم اینکه به جای دو دستور زیر من یک فانکشن توی شل ایجاد می‌کنم و اینجوری بدون مشکل با دستور خودم که ایجاد کردم هر دو مرحله رو انجام می‌دم:

# in .bashrc

mypip() {
  PKGS=("$@")
  pip download "${PKGS[@]}" --extra-index-url http://localhost:8091 -d /$HOME/whlRepo && pip install "${PKGS[@]}" --extra-index-url http://localhost:8091
}

البته برای اینکه همیشه این سرویس بالا باشه میتونیم یه سرویس توی systemd ایجاد کنیم بصورت زیر :

sudo nano /etc/systemd/system/pipyserver.service

و محتویاتش رو به شکل زیر بنویسیم:

[Unit]
Description=A minimal PyPI server for use with pip/easy_install.
After=network.target

[Service]
Type=simple
# systemd requires absolute path here too.
PIDFile= /home/<your user>/whlRepo/pypiserver.pid
User=<your user>
Group=<your user>

ExecStart=pypi-server run -p 8091 /home/<your user>/whlRepo --log-file /home/<your user>/whlRepo/log.log
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

WorkingDirectory=/home/<your user>/whlRepo

TimeoutStartSec=3
RestartSec=5

سپس با دستورات زیر فعالش کنید:

sudo systemctl enable pipyserver.service   
sudo systemctl start pipyserver.service  
sudo systemctl status pipyserver.service