{"library":"prefect-gcp","title":"Prefect GCP","description":"Prefect GCP is an integration library that allows Prefect workflows to interact seamlessly with various Google Cloud Platform (GCP) services. It provides blocks and tasks for services like Google Cloud Storage, BigQuery, Secret Manager, Vertex AI, and Cloud Run. The library is currently at version 0.6.17 and generally follows the release cadence of the main Prefect orchestration engine.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install -U \"prefect-gcp\"","pip install -U \"prefect-gcp[all_extras]\""],"cli":null},"imports":["from prefect_gcp import GcpCredentials","from prefect_gcp.cloud_storage import GcsBucket","from prefect_gcp.bigquery import BigQueryWarehouse","from prefect_gcp.secret_manager import GcpSecret"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport asyncio\nfrom prefect import flow, task\nfrom prefect_gcp import GcpCredentials\nfrom prefect_gcp.cloud_storage import GcsBucket\nfrom dotenv import load_dotenv\n\n# Load environment variables from .env file (if present)\nload_dotenv()\n\n@task\nasync def upload_and_download_file(bucket_name: str, file_content: str, source_path: str, destination_path: str):\n    \"\"\"Uploads a string to GCS and downloads it to a different path.\"\"\"\n    # Ensure GcpCredentials block exists, or create one for testing\n    # In a real scenario, you'd load a pre-configured block: GcpCredentials.load(\"my-gcp-creds\")\n    # For quickstart, we use env vars for service account info if available\n    service_account_info_str = os.environ.get('GCP_SERVICE_ACCOUNT_INFO')\n    service_account_info = None\n    if service_account_info_str:\n        import json\n        service_account_info = json.loads(service_account_info_str)\n\n    gcp_credentials = GcpCredentials(service_account_info=service_account_info)\n    await gcp_credentials.save('gcp-quickstart-creds', overwrite=True)\n\n    # Ensure GcsBucket block exists, or create one for testing\n    gcs_bucket_block = GcsBucket(bucket_name=bucket_name, gcp_credentials=gcp_credentials)\n    await gcs_bucket_block.save('gcs-quickstart-bucket', overwrite=True)\n\n    # Use the saved block in the flow\n    gcs_block = await GcsBucket.load(\"gcs-quickstart-bucket\")\n\n    print(f\"Uploading content to gs://{bucket_name}/{source_path}\")\n    await gcs_block.upload_from_bytes(file_content.encode('utf-8'), source_path)\n    print(\"Upload complete.\")\n\n    print(f\"Downloading content from gs://{bucket_name}/{source_path} to {destination_path}\")\n    downloaded_content = await gcs_block.read_bytes(source_path)\n    print(f\"Downloaded content: {downloaded_content.decode('utf-8')}\")\n\n    # Clean up the file (optional)\n    # await gcs_block.rm(source_path)\n    # print(f\"Cleaned up gs://{bucket_name}/{source_path}\")\n\n@flow(log_prints=True)\nasync def gcp_storage_flow(bucket_name: str = \"your-prefect-gcp-bucket-name\"):\n    file_content = \"Hello from Prefect GCP!\"\n    source_path = \"prefect-gcp-test.txt\"\n    destination_path = \"downloaded-prefect-gcp-test.txt\"\n    await upload_and_download_file(bucket_name, file_content, source_path, destination_path)\n\nif __name__ == \"__main__\":\n    # Set this environment variable or use actual service account info for testing\n    # export GCP_SERVICE_ACCOUNT_INFO='{\"type\": \"service_account\", ...}'\n    # Ensure you have a GCP bucket created and permissions for the service account\n    \n    # To run:\n    # 1. pip install -U \"prefect-gcp[cloud_storage]\" python-dotenv\n    # 2. prefect block register -m prefect_gcp\n    # 3. Create a GCS bucket (e.g., 'my-prefect-gcp-bucket')\n    # 4. Set GCP_SERVICE_ACCOUNT_INFO env var with your service account JSON, or rely on ADC.\n    # 5. python your_script_name.py\n    asyncio.run(gcp_storage_flow(bucket_name=os.environ.get(\"GCS_BUCKET_NAME\", \"your-prefect-gcp-bucket-name\")))","lang":"python","description":"This quickstart demonstrates how to use the `GcpCredentials` block for authentication and the `GcsBucket` block to interact with Google Cloud Storage. It uploads a simple text string to a specified bucket and then downloads it. It's designed to be runnable by either using Application Default Credentials or by providing service account JSON via an environment variable.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"0.6.11","pypi_latest":"0.6.18","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":28,"avg_import_s":10.51,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":8.07,"mem_mb":74.7,"disk_size":"383.5M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":7.88,"mem_mb":74.7,"disk_size":"383.5M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":28.2,"import_time_s":6.49,"mem_mb":71.4,"disk_size":"381M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":27.9,"import_time_s":6.35,"mem_mb":71.4,"disk_size":"381M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.04,"mem_mb":79.9,"disk_size":"408.1M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":26.43,"mem_mb":300.1,"disk_size":"600.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":27.3,"import_time_s":7.85,"mem_mb":76.9,"disk_size":"406M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":35,"import_time_s":14.93,"mem_mb":217.8,"disk_size":"599M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":7.7,"mem_mb":78.1,"disk_size":"397.0M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":23.34,"mem_mb":294.6,"disk_size":"585.9M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":22.2,"import_time_s":7.55,"mem_mb":75.1,"disk_size":"396M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":29.6,"import_time_s":14.43,"mem_mb":213.2,"disk_size":"585M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":7.31,"mem_mb":78.7,"disk_size":"394.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":20.16,"mem_mb":294.9,"disk_size":"580.6M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":21.6,"import_time_s":7.07,"mem_mb":75.5,"disk_size":"393M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":29,"import_time_s":13.26,"mem_mb":212,"disk_size":"579M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":6.1,"mem_mb":72.6,"disk_size":"315.3M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"-U","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":5.78,"mem_mb":72.6,"disk_size":"315.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":29.5,"import_time_s":5.25,"mem_mb":69.4,"disk_size":"314M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"-U","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":29.5,"import_time_s":5.31,"mem_mb":69.4,"disk_size":"314M"}]}}