ازگر میں کمانڈ لائن ویدر ایپ کیسے بنائی جائے۔

Python کے کچھ بنیادی پروجیکٹس کرنے کے بعد، میں ان پروگراموں سے تھوڑا بور ہو گیا جو ان پٹ لیتے ہیں اور کچھ واپس پرنٹ کرتے ہیں۔ میں کچھ ایسا بنانا چاہتا تھا جو دراصل انٹرنیٹ سے ڈیٹا کھینچتا ہے۔

تو میں نے یہ چھوٹی سی موسم ایپ بنائی۔ اگر API اب بھی تھوڑا سا خلاصہ محسوس کرتا ہے، تو فکر نہ کریں۔ یاد رکھیں کہ API بنیادی طور پر ایک پروگرام کے لیے دوسرے پروگرام سے معلومات کی درخواست کرنے کا ایک طریقہ ہے۔

خیال سادہ ہے۔ ٹرمینل میں شہر کا نام درج کریں اور یہ موجودہ درجہ حرارت اور ہوا کی رفتار کو ظاہر کرے گا۔ یہ فینسی نہیں ہے، لیکن یہ APIs، HTTP درخواستوں، اور کمانڈ لائن دلائل سے واقف ہونے کا ایک اچھا طریقہ ہے۔

اس ٹیوٹوریل کے اختتام تک، آپ جان لیں گے کہ HTTP درخواستیں کیسے بنائیں، JSON ڈیٹا کو پارس کریں، غلطیوں کو مناسب طریقے سے ہینڈل کریں، اور اسکرپٹ لکھیں جو آپ اپنے ٹرمینل میں حقیقت میں استعمال کر سکتے ہیں۔

ہم کیا احاطہ کریں گے:

آپ کو شروع کرنے کی کیا ضرورت ہے۔

شروع کرنے سے پہلے، درج ذیل کو چیک کریں:

  • Python انسٹال ہو گیا۔
  • کوڈ ایڈیٹر (میں VS کوڈ استعمال کرتا ہوں)
  • کہ درخواست لائبریری

اگر آپ کے پاس ابھی تک کوئی درخواست نہیں ہے تو، ایک ٹرمینل کھولیں اور چلائیں:

pip install requests

شہر کے ناموں کو کوآرڈینیٹ میں کیسے تبدیل کیا جائے۔

Weather API عام طور پر عرض البلد اور طول البلد چاہتا ہے، شہر کا نام نہیں۔ لہذا ہمیں پہلی چیز جس کی ضرورت ہے وہ ہے "کراچی” یا "نیویارک” کو کوآرڈینیٹ میں تبدیل کرنے کا طریقہ۔

اوپن میٹیو میں ایک مفت جیو کوڈنگ API ہے جو ایسا ہی کرتا ہے۔ یہاں وہ افعال ہیں جو میں نے استعمال کیے ہیں:

import requests

def get_coordinates(city_name):
    url = "https://geocoding-api.open-meteo.com/v1/search"

    params = {
        "name": city_name,
        "count": 1
    }

    response = requests.get(url, params=params, timeout=5)
    response.raise_for_status()

    data = response.json()

    if not data.get("results"):
        return None

    latitude = data["results"][0]["latitude"]
    longitude = data["results"][0]["longitude"]

    return latitude, longitude

یہ بہت آسان ہے۔ میں شہر کا نام بھیجتا ہوں، ایک نتیجہ کی درخواست کرتا ہوں، اور پھر عرض البلد اور عرض البلد نکالتا ہوں۔ اگر API کو کچھ نہیں ملتا ہے، تو یہ بعد میں کریش ہونے کے بجائے None کو لوٹاتا ہے۔

ایک چھوٹا سا انتباہ: شہر کے کچھ نام متعدد جگہوں پر موجود ہیں۔ یہ کوڈ پہلا میچ لیتا ہے، اس لیے ہو سکتا ہے کہ یہ ہمیشہ اپنے مطلوبہ کوڈ کو منتخب نہ کرے۔ براہ کرم اسے اپنے پروجیکٹ میں استعمال کرنے سے پہلے دو بار چیک کریں۔

موسم کا حقیقی ڈیٹا کیسے حاصل کیا جائے۔

ایک بار جب آپ کو کوآرڈینیٹ مل جائیں تو آپ موسم کے بارے میں پوچھ سکتے ہیں۔

def get_weather(latitude, longitude):
    url = "https://api.open-meteo.com/v1/forecast"

    params = {
        "latitude": latitude,
        "longitude": longitude,
        "current": "temperature_2m,wind_speed_10m"
    }

    response = requests.get(url, params=params, timeout=5)
    response.raise_for_status()

    data = response.json()

    return data["current"]

درجہ حرارت_2m اور windspeed_10m پیرامیٹرز زمین سے 2m اوپر درجہ حرارت اور 10m پر ہوا کی رفتار کی درخواست کرتے ہیں۔ کرنٹ بتا کر، آپ API کو بتاتے ہیں کہ آپ کو صرف موجودہ ڈیٹا چاہیے، آگے کے کئی دنوں کی پیشین گوئیاں نہیں۔ API درحقیقت بہت سارے دوسرے ڈیٹا کو بھی واپس کرتا ہے، لیکن ہم صرف موجودہ حصے کو نکالیں گے۔

اسے ٹرمینل میں کیسے چلائیں۔

میں اس طرح کچھ چلانے کے قابل ہونا چاہتا تھا:

python Weather.py کراچی

تو میں نظام ماڈیول:

import sys

def main():
    if len(sys.argv) < 2:
        print("Usage: python weather.py ")
        return

    city = " ".join(sys.argv[1:])

    try:
        coordinates = get_coordinates(city)

        if not coordinates:
            print(f"City not found: {city}")
            return

        latitude, longitude = coordinates
        weather = get_weather(latitude, longitude)

        print(f"\nWeather in {city.title()}")
        print(f"Temperature: {weather['temperature_2m']}°C")
        print(f"Wind speed: {weather['wind_speed_10m']} km/h")

    except requests.exceptions.RequestException:
        print("Couldn't connect to the weather service. Check your internet connection and try again.")

    except (KeyError, ValueError):
        print("Something went wrong while reading the weather data.")

if __name__ == "__main__":
    main()

sys ماڈیول کمانڈ لائن دلائل تک رسائی فراہم کرتا ہے۔ sys.argv یہ ہر اس چیز کی فہرست ہے جو آپ ٹرمینل میں ٹائپ کرتے ہیں۔ sys.argv[0] فائل کا نام ہے (weather.py) اور sys.argv[1] یہ اس شہر کا نام ہے۔ استعمال کریں " ".join(sys.argv[1:]) یہ شہر کے ناموں کو خالی جگہوں کے ساتھ سنبھال سکتا ہے، جیسے نیویارک۔

آئیے اس کی جانچ کریں۔

فائل کو Weather.py کے بطور محفوظ کریں، اس فولڈر میں ایک ٹرمینل کھولیں اور درج ذیل کو آزمائیں:

python weather.py Madrid
python weather.py Paris
python weather.py Washington

اگر آپ اپنے شہر میں داخل ہونا بھول جاتے ہیں، تو یہ صرف آپ کو بتائے گا کہ اسے کیسے استعمال کیا جائے۔

Weather in Madrid
Temperature: 15.2°C
Wind speed: 8.4 km/h

آگے کیا شامل کرنا ہے۔

بنیادی ورژن کے کام کرنے کے بعد، کچھ آسان اپ گریڈ ہوتے ہیں جو آپ کر سکتے ہیں۔

  • نمی شامل کریں (نسبتا نمی_2m)
  • موجودہ صورتحال کے بجائے سادہ پیشن گوئی دکھائیں۔
  • اگر نام مبہم ہے تو صارفین کو متعدد مماثل شہروں میں سے انتخاب کرنے کی اجازت دیں۔
  • آؤٹ پٹ کو خوبصورت بنائیں

میں عام طور پر ایک چھوٹی سی بہتری چنتا ہوں، اسے کام کرتا ہوں، اور پھر آگے بڑھتا ہوں۔ ایک ساتھ سب کچھ کرنے کی کوشش کرنا عام طور پر گندا ہو جاتا ہے۔

حتمی خیالات

اگر آپ "پرنٹ ہیلو ورلڈ” کے مرحلے سے گزرنا چاہتے ہیں اور کوئی ایسی چیز بنانا چاہتے ہیں جو حقیقت میں انٹرنیٹ کے ساتھ بات چیت کرے، تو یہ ایک ٹھوس چھوٹا پروجیکٹ ہے۔ آپ کو فنکشنز، لغات، ایرر ہینڈلنگ، اور APIs کے ساتھ ہینڈ آن پریکٹس ملے گی جنہیں آپ ہر وقت استعمال کریں گے۔

لیکن یہاں اہم حصہ ہے. ایک بار جب آپ یہ کام کر لیں، تو اس صفحہ کو بند کر دیں اور پوری چیز کو شروع سے دوبارہ بنائیں۔

آپ کچھ بھول جائیں گے۔ آپ کو شاید کوئی عجیب خرابی ہو گی اور اسے دیکھتے ہوئے ایک گھنٹہ ضائع ہو جائے گا۔ یہ ٹھیک ہے یہ وہ حصہ ہے جو درحقیقت آپ کو کچھ سکھاتا ہے۔ میرے کوڈ کو کاپی اور پیسٹ کرنے سے آپ کے دماغ میں کوئی چیز مضبوط نہیں ہوتی۔ یہ جاننا کہ آپ کا ٹوٹا کیوں ہے ہاں۔

ایک بار جب آپ کے پاس موسم کی ایپ کام کر لیتی ہے، تو بالکل مختلف API (مثلاً فلمیں، کریپٹو کرنسی کی قیمتیں، کھیلوں کے اسکور وغیرہ) کا استعمال کرتے ہوئے وہی طریقہ آزمائیں۔ پیٹرن تقریبا ایک ہی ہے. پہلے بنیادی ورژن چلائیں اور پھر رکیں۔

اوپر تک سکرول کریں۔