Vagrant və PyCharm birgə istifadəsi(Python remote interpretatoru sudo ilə çağırmaq haqqında)

Salam, hörmətli dostlar.
Bu məqalədə PyCharm-da Vagrant-ın istifadəsi haqqında kiçik söhbət açacam, əsas çətinlik yaradan hissə, remote VM-dəki, Python interpretatorunu sudo ilə çağırmaq oldu.

Məsələyə biraz giriş qataq.
Python 3-də yazdığım belə bir Open Source MySQL fiziki backup alan tool var: MySQL-AutoXtraBackup

Dokumentasiyasını burdan oxuya bilərsiniz: MySQL-AutoXtraBackup DOC

Yeni başlayanların həyatını asanlaşdırmaq məqsədilə, Vagrant env yaratmaq istəyirəm və bu məqsədlə proyektin root direktoriyasında VagrantFile adlı bir fayl yaratmaq lazımdır. Vagrant nədir, nə olan şeydir bu haqda oxuya bilərsiniz: Vagrant DOC

Qısa olaraq belə deyə bilərik ki, biz VagrantFile daxilində bizim virtual maşının növü, ramı, ip-si və bu virtual maşın yarandıqdan sonra hansı əmrləri icra etmək lazım olduğunu göstəririk və daha sonra sadəcə vagrant up etməklə bizim bütün mühit avto rejimdə hazır olur. Çox gözəl haqq-hesabdır.

Öz proyektim üçün nümunə VagrantFile:

Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.network "public_network",
    use_dhcp_assigned_default_route: true

config.vm.provider "virtualbox" do |vb|
  vb.gui = true
  vb.memory = "2024"
end

config.vm.provision "shell", inline: <<-SHELL
     sudo yum -y update
     sudo yum -y install yum-utils
     sudo yum -y groupinstall development
     sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
     sudo yum -y update
     sudo yum -y install python35u
     sudo yum -y install python35u-pip
     sudo yum -y install python35u-devel
     sudo pip3.5 install setuptools -U pip setuptools
     cd /vagrant
     sudo python3.5 setup.py install
   SHELL
end

Məncə faylın özü kifayət qədər izahlıdır. Burda diqqət yetirsəniz görərsiniz ki, provision zamanı, hansı əmrlər icra olunmalıdır hamısını əvvəlcədən qeyd etmək mümkündür. Burda xüsusilə qeyd etmək lazımdır ki, vagrant up əmri zamanı, proyektin özü avto rejimdə VM-ə rsync olunur(default path – /vagrant).
Yəni bizim proyekt artıq VM start olanda ordadır:

[vagrant@localhost ~]$ ls /vagrant/
autoxtrabackup.py  backup_prepare  dist  general_conf  LICENSE.txt           mysql_autoxtrabackup.egg-info  prepare_env_test_mode  README.md  setup.py  Vagrantfile
backup_dir         build           docs  __init__.py   master_backup_script  partial_recovery               __pycache__            setup.cfg  test

Bu səbəbdəndir ki, biz həmin qovluğa keçib setup.py-ı da çağıra bilirik.

Gəlin qəbul edək ki, bizim Vagrant CentOS 7-miz artıq hazırdır.
Proyekt üçün remote interpretatoru biz PyCharm-da rəsmi doc-unda göstərildiyi kimi qeyd edə bilərik. Yəni, mənim proyektimin Python interpretatoru local-ımda yox məhz CentOS 7-dəki python3.5 olacaq. Daha ətraflı, oxuyun: configuring-remote-interpreters-via-vagrant

Bunları etdikdən sonra, mən pytest-lərimi debugger-lə run etməyə çalışanda dəhşətli mənzərə ilə qarşılaşıram:

ssh://[email protected]:2222/usr/bin/python3.5 -u /home/vagrant/.pycharm_helpers/pydev/pydevd.py --multiproc --qt-support --client '0.0.0.0' --port 41402 --file /home/vagrant/.pycharm_helpers/pycharm/_jb_pytest_runner.py --target test_clone_build_start_server.py::TestCloneBuildStartServer.test_clone_percona_qa
Testing started at 1:58 PM ...
warning: Debugger speedups using cython not found. Run '"/usr/bin/python3.5" "/home/vagrant/.pycharm_helpers/pydev/setup_cython.py" build_ext --inplace' to build.Connected to pydev debugger (build 171.4694.67)

pydev debugger: process 29982 is connecting

Launching py.test with arguments test_clone_build_start_server.py::TestCloneBuildStartServer::test_clone_percona_qa in /vagrant/test
============================= test session starts ==============================
platform linux -- Python 3.5.4, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /vagrant, inifile:
plugins: pycharm-0.4.0
collecting 1 item                                                               collected 1 item                                                                

test_clone_build_start_server.py F
test/test_clone_build_start_server.py:8 (TestCloneBuildStartServer.test_clone_percona_qa)
self = <vagrant.test.test_clone_build_start_server.TestCloneBuildStartServer object at 0x7f35039ce9b0>
return_clone_obj = <prepare_env_test_mode.clone_build_start_server.CloneBuildStartServer object at 0x7f3503f427b8>

    def test_clone_percona_qa(self, return_clone_obj):
>       assert return_clone_obj.clone_percona_qa() is True
E       assert False is True
E        +  where False = <bound method CloneBuildStartServer.clone_percona_qa of <prepare_env_test_mode.clone_build_start_server.CloneBuildStartServer object at 0x7f3503f427b8>>()
E        +    where <bound method CloneBuildStartServer.clone_percona_qa of <prepare_env_test_mode.clone_build_start_server.CloneBuildStartServer object at 0x7f3503f427b8>> = <prepare_env_test_mode.clone_build_start_server.CloneBuildStartServer object at 0x7f3503f427b8>.clone_percona_qa

test_clone_build_start_server.py:10: AssertionError

Göründüyü kimi,test fail olub. Səbəbini isə debugger-lə həmin bu funksiyaya breakpoint qoyub aşkarlamaq olur:

Göründüyü kimi, default vagrant useri ilə icra olunan əmr icazə çətinliyi ilə qarşılaşıb(permission denied).
İlk ağıla gələn həll budur ki, remote python interpretatoru sudo ilə çağıraq. Lakin PyCharm-da belə bir funksionallıq aşkarlamadım. Dolayısı ilə aşağıdakı kimi elədim.
İlk öncə /home/vagrant-da python-sudo.sh adlı fayl yaratdım:

[vagrant@localhost ~]$  cd /home/vagrant
[vagrant@localhost ~]$  touch python-sudo.sh
[vagrant@localhost ~]$  echo "#!/bin/bash" > python-sudo.sh
[vagrant@localhost ~]$  echo 'sudo /usr/bin/python3.5 "$@"' >> python-sudo.sh
[vagrant@localhost ~]$  chmod +x python-sudo.sh

Daha sonra PyCharm-da məhz bu python-sudo.sh faylını “Remote Interpretator” kimi qeydiyyata alırıq:

Çox gözəl indi də testi bir də icra edək:

ssh://[email protected]:2222/home/vagrant/python-sudo.sh -u /home/vagrant/.pycharm_helpers/pydev/pydevd.py --multiproc --qt-support --client '0.0.0.0' --port 38817 --file /home/vagrant/.pycharm_helpers/pycharm/_jb_pytest_runner.py --target test_clone_build_start_server.py::TestCloneBuildStartServer.test_clone_percona_qa
Testing started at 1:29 PM ...
warning: Debugger speedups using cython not found. Run '"/usr/bin/python3.5" "/home/vagrant/.pycharm_helpers/pydev/setup_cython.py" build_ext --inplace' to build.Connected to pydev debugger (build 171.4694.67)

pydev debugger: process 29463 is connecting

Launching py.test with arguments test_clone_build_start_server.py::TestCloneBuildStartServer::test_clone_percona_qa in /vagrant/test
============================= test session starts ==============================
platform linux -- Python 3.5.4, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /vagrant, inifile:
plugins: pycharm-0.4.0
collecting 1 item                                                               collected 1 item                                                                

test_clone_build_start_server.py 

========================= 1 passed in 1636.52 seconds ==========================
.
Process finished with exit code 0

1 passed mesajı bizi sevindirir.
Suallarınız olsa, zəhmət olmasa qeyd edin, müzakirə edək.
Təşəkkürlər.

Səs: +20. Bəyənilsin Zəifdir

Müəllif: Şəhriyar Rzayev

Şərh yazın