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.