{"id":6463,"date":"2025-05-02T19:23:38","date_gmt":"2025-05-02T17:23:38","guid":{"rendered":"https:\/\/arduino.net.pl\/?p=6463"},"modified":"2025-05-05T20:35:19","modified_gmt":"2025-05-05T18:35:19","slug":"raspberry-pi-zero-w-python-vsc","status":"publish","type":"post","link":"https:\/\/arduino.net.pl\/index.php\/raspberry-pi-zero-w-python-vsc\/","title":{"rendered":"Raspberry Pi Zero W, Python oraz Visual Studio Code"},"content":{"rendered":"\n<p class=\"has-accent-1-color has-text-color has-link-color has-large-font-size wp-elements-f501eef37b87410bff5fe2d5d4f50749\">Praca nad projektami w j\u0119zyku Python na <strong>Raspberry Pi Zero W<\/strong> cz\u0119sto zaczyna si\u0119 w komfortowym \u015brodowisku <strong>Visual Studio Code<\/strong>. Chc\u0105c wykorzysta\u0107 wygod\u0119 zdalnego dost\u0119pu oferowan\u0105 przez rozszerzenie Remote \u2013 SSH, natkn\u0105\u0142em si\u0119 na niespodziewan\u0105 przeszkod\u0119. Okaza\u0142o si\u0119, \u017ce <strong>architektura ARMv6<\/strong>, serce Raspberry Pi Zero W, <strong>nie jest kompatybilna z serwerem vscode-server<\/strong> instalowanym przez Remote SSH. W poszukiwaniu wyj\u015bcia z tej sytuacji, zwr\u00f3ci\u0142em si\u0119 o pomoc do ChatGPT i znalaz\u0142em skuteczn\u0105 alternatyw\u0119.<\/p>\n\n\n\n<p><strong>CharGPT:<\/strong> Oto komplet gotowych plik\u00f3w, kt\u00f3re umo\u017cliwi\u0105 Ci:<\/p>\n<ol>\n<li>\n<p>Wys\u0142anie projektu z Maca na Raspberry Pi<\/p>\n<\/li>\n<li>\n<p>Automatyczne utworzenie <code>venv<\/code> na Raspberry Pi<\/p>\n<\/li>\n<li>\n<p>Instalacj\u0119 zale\u017cno\u015bci z <code>requirements.txt<\/code><\/p>\n<\/li>\n<li>\n<p>Uruchomienie Twojego programu<\/p>\n<\/li>\n<\/ol>\n<hr>\n<h2>&#x1f4c1; Struktura folderu <code>pi-project<\/code> na Twoim <strong>Macu<\/strong><\/h2>\n<pre><code>pi-project\/\n\u251c\u2500\u2500 main.py\n\u251c\u2500\u2500 requirements.txt\n\u251c\u2500\u2500 install-on-pi.sh\n\u2514\u2500\u2500 deploy.sh\n<\/code><\/pre>\n<hr>\n<h2>&#x1f9f1; Zawarto\u015b\u0107 plik\u00f3w<\/h2>\n<h4>1. <code>main.py<\/code> \u2014 przyk\u0142adowy kod Pythona<\/h4>\n<pre><code class=\"language-python\"># main.py\nimport requests\n\nprint(\"Hello from Raspberry Pi!\")\nresponse = requests.get(\"https:\/\/api.github.com\")\nprint(\"GitHub status:\", response.status_code)\n<\/code><\/pre>\n<hr>\n<h3>2. <code>requirements.txt<\/code> \u2014 lista bibliotek<\/h3>\n<pre><code>requests\n<\/code><\/pre>\n<p>Dodawaj tu wszystko, co Tw\u00f3j projekt potrzebuje (np. <code>flask<\/code>, <code>numpy<\/code>, <code>paho-mqtt<\/code> itd.).<\/p>\n<hr>\n<h3>3. <code>install-on-pi.sh<\/code> \u2014 uruchamiane <strong>na Raspberry Pi<\/strong><\/h3>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\necho \"&#x1f4e6; Tworzenie \u015brodowiska wirtualnego...\"\npython3 -m venv venv\nsource venv\/bin\/activate\n\necho \"&#x1f4e6; Instalacja zale\u017cno\u015bci...\"\npip install -r requirements.txt\n\necho \"&#x1f680; Uruchamianie programu...\"\npython main.py\n<\/code><\/pre>\n<p>Uczy\u0144 go wykonywalnym:<\/p>\n<pre><code class=\"language-bash\">chmod +x install-on-pi.sh\n<\/code><\/pre>\n<hr>\n<h3>4. <code>deploy.sh<\/code> \u2014 uruchamiane <strong>na Macu<\/strong><\/h3>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\nPI_USER=minimj\nPI_HOST=raspberrypir2.local\nREMOTE_DIR=\/home\/$PI_USER\/pi-project\n\necho \"&#x1f4e4; Wysy\u0142anie projektu na Raspberry Pi...\"\nscp -r . \"$PI_USER@$PI_HOST:$REMOTE_DIR\"\n\necho \"&#x1f517; \u0141\u0105czenie przez SSH i uruchamianie skryptu instalacyjnego...\"\nssh \"$PI_USER@$PI_HOST\" \"cd $REMOTE_DIR &amp;&amp; bash install-on-pi.sh\"\n<\/code><\/pre>\n<p>Uczy\u0144 go wykonywalnym:<\/p>\n<pre><code class=\"language-bash\">chmod +x deploy.sh\n<\/code><\/pre>\n<hr>\n<h2>&#x1f680; Jak uruchomi\u0107?<\/h2>\n<p>Z poziomu Maca:<\/p>\n<pre><code class=\"language-bash\">cd ~\/pi-project\n.\/deploy.sh\n<\/code><\/pre>\n<hr>\n<p>Wszystko \u2014 \u0142\u0105cznie z <code>venv<\/code> i instalacj\u0105 zale\u017cno\u015bci \u2014 wykona si\u0119 automatycznie <strong>na Raspberry Pi<\/strong>.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-accent-1-color has-text-color has-link-color has-large-font-size wp-elements-7d222924f299fe3cfbba26698eb6d7cd\">Po przetestowaniu ca\u0142o\u015bci, kt\u00f3re wypad\u0142o \u015bwietnie, poprosi\u0142em <strong>ChatGPT<\/strong> o wyja\u015bnienie co dok\u0142adnie si\u0119 dzia\u0142o na moim komputerze i na Raspberry Pi Zero W.<\/p>\n\n\n\n<p>\u00a0<\/p>\n<hr \/>\n<h2>&#x1f5a5;&#xfe0f; Wyja\u015bniam co dzia\u0142o si\u0119 na<strong> Twoim Macu<\/strong>:<\/h2>\n<ol>\n<li>\n<p><strong>Utworzy\u0142e\u015b folder projektu<\/strong> (np. <code>~\/pi-project<\/code>) i umie\u015bci\u0142e\u015b w nim:<\/p>\n<ul>\n<li>\n<p><code>main.py<\/code> \u2013 Tw\u00f3j kod w Pythonie,<\/p>\n<\/li>\n<li>\n<p><code>requirements.txt<\/code> \u2013 list\u0119 bibliotek do zainstalowania na Pi,<\/p>\n<\/li>\n<li>\n<p><code>install-on-pi.sh<\/code> \u2013 skrypt, kt\u00f3ry Raspberry Pi uruchamia, aby przygotowa\u0107 \u015brodowisko i uruchomi\u0107 program,<\/p>\n<\/li>\n<li>\n<p><code>deploy.sh<\/code> \u2013 skrypt uruchamiany z Maca, kt\u00f3ry:<\/p>\n<ul>\n<li>\n<p>przesy\u0142a pliki na Raspberry Pi przez <code>scp<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0142\u0105czy si\u0119 zdalnie przez <code>ssh<\/code>,<\/p>\n<\/li>\n<li>\n<p>uruchamia <code>install-on-pi.sh<\/code> na Raspberry Pi.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Uruchomi\u0142e\u015b <code>deploy.sh<\/code><\/strong>, co zainicjowa\u0142o ca\u0142y proces.<\/p>\n<\/li>\n<\/ol>\n<hr \/>\n<h2>&#x1f353; Co dzia\u0142o si\u0119 na <strong>Raspberry Pi Zero W<\/strong>:<\/h2>\n<ol>\n<li>\n<p>&#x1f4c1; Pliki z projektu zosta\u0142y przes\u0142ane do katalogu <code>~\/pi-project<\/code>.<\/p>\n<\/li>\n<li>\n<p>&#x1f41a; Raspberry Pi wykona\u0142 polecenia z <code>install-on-pi.sh<\/code>:<\/p>\n<ul>\n<li>\n<p>utworzy\u0142 <strong>wirtualne \u015brodowisko Python (<code>venv<\/code>)<\/strong> w katalogu projektu,<\/p>\n<\/li>\n<li>\n<p>aktywowa\u0142 to \u015brodowisko (<code>source venv\/bin\/activate<\/code>),<\/p>\n<\/li>\n<li>\n<p>zainstalowa\u0142 bibliotek\u0119 <code>requests<\/code> (z <code>requirements.txt<\/code>) za pomoc\u0105 <code>pip<\/code>,<\/p>\n<\/li>\n<li>\n<p>uruchomi\u0142 Tw\u00f3j program <code>main.py<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>&#x1f5a8;&#xfe0f; Program <code>main.py<\/code> zrobi\u0142 zapytanie HTTP do GitHub API i wy\u015bwietli\u0142 status odpowiedzi \u2014 co potwierdzi\u0142o, \u017ce:<\/p>\n<ul>\n<li>\n<p>Raspberry Pi ma po\u0142\u0105czenie z internetem,<\/p>\n<\/li>\n<li>\n<p>Python dzia\u0142a prawid\u0142owo,<\/p>\n<\/li>\n<li>\n<p>biblioteka <code>requests<\/code> zosta\u0142a zainstalowana poprawnie.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr \/>\n<h3>&#x2705; Dzi\u0119ki temu:<\/h3>\n<ul style=\"list-style-type: square;\">\n<li>\n<p><strong>Programujesz lokalnie na Macu<\/strong>, gdzie masz wygodny edytor i szybki dost\u0119p do plik\u00f3w.<\/p>\n<\/li>\n<li>\n<p><strong>Raspberry Pi wykonuje kod<\/strong>, instaluj\u0105c potrzebne zale\u017cno\u015bci i dzia\u0142aj\u0105c jak ma\u0142y serwer.<\/p>\n<\/li>\n<li>\n<p>Wszystko dzieje si\u0119 przez Wi-Fi\/USB bez potrzeby monitora, klawiatury czy myszy.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n\n\n\n\n\n<div style=\"height:207px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Nowy skrypt deploy.sh, kt\u00f3ry wysy\u0142a zawarto\u015b\u0107 foldera do Raspberry<\/h1>\n\n\n\n<p>Oto zaktualizowany, prosty i <strong>inteligentny<\/strong> skrypt <code>deploy.sh<\/code>, kt\u00f3ry:<\/p>\n<ul>\n<li>\n<p>u\u017cywa <code>rsync<\/code> (szybszy od <code>scp<\/code>),<\/p>\n<\/li>\n<li>\n<p>pomija <code>venv<\/code>,<\/p>\n<\/li>\n<li>\n<p>mo\u017ce zainstalowa\u0107 zale\u017cno\u015bci (je\u015bli chcesz),<\/p>\n<\/li>\n<li>\n<p>uruchamia Tw\u00f3j program po przes\u0142aniu.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2>&#x1f4c4; Plik <code>deploy.sh<\/code><\/h2>\n<p>Umie\u015b\u0107 go <strong>lokalnie<\/strong> w folderze Twojego projektu na macOS (<code>~\/pi-project\/deploy.sh<\/code>):<code class=\"language-bash\"><\/code><\/p>\n<div>\n<div><code>#!\/bin\/bash<\/code><\/div>\n<br \/>\n<div><code># Zmienne \u2013 dostosuj w razie potrzeby<\/code><\/div>\n<div><code>PI_USER=\"pi\"<\/code><\/div>\n<div><code>PI_HOST=\"raspberrypir2.local\"<\/code><\/div>\n<div><code>PI_PROJECT_PATH=\"\/home\/pi\/pi-project\"<\/code><\/div>\n<div><code>LOCAL_PROJECT_PATH=\"$(pwd)\"<\/code><\/div>\n<div><code>REMOTE=\"$PI_USER@$PI_HOST:$PI_PROJECT_PATH\"<\/code><\/div>\n<br \/>\n<div><code>echo \"&#x1f4e6; Synchronizuj\u0119 projekt na Raspberry Pi...\"<\/code><\/div>\n<div><code>rsync -avz \\<\/code><\/div>\n<div><code>--exclude'.venv'\\<\/code><\/div>\n<div><code>--exclude'*.sh'\\<\/code><\/div>\n<div><code>--exclude'*.pyc'\\<\/code><\/div>\n<div><code>--exclude'__pycache__'\\<\/code><\/div>\n<div><code>--exclude'.DS_Store'\\<\/code><\/div>\n<div><code>--exclude'.git'\\<\/code><\/div>\n<div><code>--exclude'.gitignore'\\<\/code><\/div>\n<div><code>\"$LOCAL_PROJECT_PATH\/\"\"$REMOTE\/\"<\/code><\/div>\n<br \/>\n<div><code>echo \"&#x2705; Synchronizacja zako\u0144czona.\"<\/code><\/div>\n<br \/>\n<div><code>echo \"&#x1f517; \u0141\u0105czenie przez SSH w celu aktywacji \u015brodowiska i uruchomienia programu...\"<\/code><\/div>\n<div><code>ssh \"$PI_USER@$PI_HOST\" &lt;&lt; 'EOF'<\/code><\/div>\n<div><code>cd ~\/pi-project<\/code><\/div>\n<div><code>source venv\/bin\/activate<\/code><\/div>\n<div><code>pip install -r requirements.txt<\/code><\/div>\n<div><code>python3 main.py<\/code><\/div>\n<div><code>EOF<\/code><\/div>\n<\/div>\n<hr \/>\n<h2>&#x1f6e0; Co robi skrypt?<\/h2>\n<ol>\n<li>\n<p>Synchronizuje <strong>ca\u0142y folder projektu<\/strong> z Pi (pomijaj\u0105c <code>venv<\/code> i <code>.git<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0141\u0105czy si\u0119 z Pi przez <code>ssh<\/code>.<\/p>\n<\/li>\n<li>\n<p>Aktywuje zdalne \u015brodowisko wirtualne.<\/p>\n<\/li>\n<li>\n<p>Instaluje wymagane biblioteki (z <code>requirements.txt<\/code>).<\/p>\n<\/li>\n<li>\n<p>Uruchamia <code>main.py<\/code>.<\/p>\n<\/li>\n<\/ol>\n<hr \/>\n<h2>&#x2705; Jak u\u017cywa\u0107?<\/h2>\n<ol>\n<li>\n<p>Upewnij si\u0119, \u017ce masz uprawnienia do wykonania:<\/p>\n<pre><code class=\"language-bash\">chmod +x deploy.sh\n<\/code><\/pre>\n<\/li>\n<li>\n<p>Uruchom z terminala:<\/p>\n<pre><code class=\"language-bash\">.\/deploy.sh\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<hr \/>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Praca nad projektami w j\u0119zyku Python na Raspberry Pi Zero W cz\u0119sto zaczyna si\u0119 w komfortowym \u015brodowisku Visual Studio Code. Chc\u0105c wykorzysta\u0107 wygod\u0119 zdalnego dost\u0119pu oferowan\u0105 przez rozszerzenie Remote \u2013&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[37,59,114,145],"tags":[180,30],"class_list":["post-6463","post","type-post","status-publish","format-standard","hentry","category-komunikacja","category-python","category-raspberry","category-visualstudiocode-programowanie","tag-ssh","tag-tutorial"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/6463","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/comments?post=6463"}],"version-history":[{"count":15,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/6463\/revisions"}],"predecessor-version":[{"id":6489,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/6463\/revisions\/6489"}],"wp:attachment":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/media?parent=6463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/categories?post=6463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/tags?post=6463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}