[{"data":1,"prerenderedAt":300},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-python-venv-pip-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":191,"renderedTakeaway":192,"latestArticles":193,"toc":289},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":83,"series":84,"authors":183,"seoTitle":21,"seoDescription":21,"body_locale":186,"available_locales":187,"body":189,"takeway":190,"prerequisite":21},138,"venv Python: Instalasi yang Masuk ke Python yang Salah","python-venv-pip","`pip install` mencetak Successfully installed, lalu jalan berikutnya melempar ModuleNotFoundError di mesin yang sama. Dua interpreter, satu instalasi, dan variabel yang skripmu periksa justru tidak pernah dipasang oleh interpreter.","2026-11-07T12:00:00.000Z",[80,81,82],"python","venv","pip","\u002Fog\u002Fpython-venv-pip.png",{"id":85,"title":86,"title_id":87,"slug":88,"description":89,"description_id":90,"articles":91,"children_series":152,"parent_series":153},18,"Working with Python Scripts","Menggunakan Script Python","python-pemrograman-dengan-script","Leave the interpreter and start writing real .py files, including how to take input and print output.","Keluar dari interpreter dan mulai nulis file .py sendiri, lengkap dengan cara mengambil input dan menampilkan output.",[92,113,129,145],{"id":93,"title":94,"title_id":95,"slug":96,"excerpt":97,"excerpt_id":98,"has_translation":12,"published_at":99,"reading_time":100,"hidden_from_listing":15,"tags":101,"thumbnail_image":21,"og_image":104,"series":105,"authors":106},90,"Writing and Running a Python Script","Menulis dan Menjalankan Script Python","menulis-dan-menjalankan-script-python","A Python script is a file holding Python code, and it usually carries the .py extension.","Script python merupakan file berisi kode dengan bahasa Python yang biasanya memiliki ekstensi .py","2021-03-21T14:49:24.000Z",4,[80,49,102,103],"tooling","cli","\u002Fog\u002Fmenulis-dan-menjalankan-script-python.png",{"id":85,"title":86,"title_id":87,"slug":88},[107],{"authors_id":108},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",{"id":114,"title":115,"title_id":116,"slug":117,"excerpt":118,"excerpt_id":119,"has_translation":12,"published_at":120,"reading_time":100,"hidden_from_listing":15,"tags":121,"thumbnail_image":21,"og_image":124,"series":125,"authors":126},91,"Input and Output Systems in Python 3","Sistem Input dan Output pada Python 3","sistem-input-dan-output-pada-python-3","A few functions, print() and input() among them, are the standard tools most I\u002FO work in Python is built on.","Beberapa fungsi seperti print() dan input(), merupakan fungsi standar yang banyak digunakan untuk melakukan I\u002FO.","2021-05-19T14:57:25.000Z",[80,122,123],"input-output","dasar","\u002Fog\u002Fsistem-input-dan-output-pada-python-3.png",{"id":85,"title":86,"title_id":87,"slug":88},[127],{"authors_id":128},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":130,"title":131,"title_id":132,"slug":133,"excerpt":134,"excerpt_id":135,"has_translation":12,"published_at":136,"reading_time":137,"hidden_from_listing":15,"tags":138,"thumbnail_image":21,"og_image":140,"series":141,"authors":142},136,"Python Modules: the Import That Printed the Report","Modul Python: Import yang Mencetak Laporannya","python-modules","You pull one function out into its own file, import it, and the whole report runs again and eats your input. A module is a file, `import` runs it top to bottom, and one line decides which of the two jobs it is doing.","Kamu memindahkan satu fungsi ke file sendiri, meng-import-nya, dan seluruh laporan jalan lagi lalu memakan inputmu. Modul adalah file, `import` menjalankannya dari atas ke bawah, dan satu baris menentukan pekerjaan mana yang sedang dijalankan file itu.","2026-11-06T01:00:00.000Z",7,[80,139],"modules","\u002Fog\u002Fpython-modules.png",{"id":85,"title":86,"title_id":87,"slug":88},[143],{"authors_id":144},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":74,"title":146,"title_id":75,"slug":76,"excerpt":147,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":83,"series":148,"authors":149},"Python venv: the Install That Went Into the Wrong Python","`pip install` printed Successfully installed, and the next run raised ModuleNotFoundError on the same machine. Two interpreters, one install, and the variable your script checks is the one the interpreter never sets.",{"id":85,"title":86,"title_id":87,"slug":88},[150],{"authors_id":151},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},[],{"id":154,"title":52,"title_id":53,"slug":54,"parent_series":155,"children_series":156},10,{"id":109,"title":48,"title_id":48,"slug":49},[157,162,167,168,173,178],{"id":158,"title":159,"title_id":160,"slug":161,"cover_image":21},16,"Getting Started with Python","Berkenalan dengan Bahasa Python","python-intro",{"id":163,"title":164,"title_id":165,"slug":166,"cover_image":21},17,"Variables, Types, and Operations","Variabel, Tipe Data, dan Operasi","python-variabel-tipe-data",{"id":85,"title":86,"title_id":87,"slug":88,"cover_image":21},{"id":169,"title":170,"title_id":171,"slug":172,"cover_image":21},19,"Control Structures","Struktur Kontrol","python-struktur-kontrol",{"id":174,"title":175,"title_id":176,"slug":177,"cover_image":21},20,"Functional Programming with Python","Pemrograman Fungsional dengan Python","python-pemrograman-fungsional",{"id":179,"title":180,"title_id":181,"slug":182,"cover_image":21},30,"Collections and Strings","Koleksi dan String","python-collections",[184],{"authors_id":185},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},"id",[188,186],"en","\nInstalasinya mencetak \"Successfully installed\". Skripnya berjalan normal di satu terminal. Lalu tombol Run di editor, atau shell baru, melempar `ModuleNotFoundError` untuk package yang baru saja kamu pasang, di mesin yang sama dan di proyek yang sama.\n\nKamu punya dua interpreter di satu mesin, yaitu interpreter sistem dan venv proyekmu, dan `pip install` hanya menyentuh interpreter yang menjalankannya.\n\nIni versi yang sudah diukur, di Linux dengan Python 3.14.9 pada 2026-11-07. Modul `venv` sudah bawaan Python, jadi tidak ada yang perlu dipasang lebih dulu ([dokumentasi venv](https:\u002F\u002Fdocs.python.org\u002F3\u002Flibrary\u002Fvenv.html)).\n\n`python3 -m venv .venv` menulis venv ke dalam `.venv\u002F`. Mengaktifkannya adalah perubahan pada shell: `source .venv\u002Fbin\u002Factivate` di macOS dan Linux, `.venv\\Scripts\\activate` di Windows. Setelah itu, `python` dan `pip` berarti yang ada di venv. Aktivasi itu praktis, bukan wajib, karena `.venv\u002Fbin\u002Fpython` adalah interpreter yang sama tanpa aktivasi.\n\n```bash\n$ python3 --version\nPython 3.14.9\n$ python3 -m venv .venv\n$ .venv\u002Fbin\u002Fpip install requests\n```\n\nBaris terakhir dari output instalasi:\n\n```text\nSuccessfully installed certifi-2026.10.23 charset_normalizer-3.5.2 idna-3.20 requests-2.34.2 urllib3-2.8.0\n```\n\nSatu `pip install requests` menarik lima package, dan `du -sh .venv` melaporkan `9.3M`. Sekarang jalankan probe satu baris yang sama dengan masing-masing interpreter, di mesin yang sama pada detik yang sama:\n\n```console\n$ .venv\u002Fbin\u002Fpython -c \"import requests; print(requests.__version__)\"\n2.34.2\n$ python3 -c \"import requests; print(requests.__version__)\"\nModuleNotFoundError: No module named 'requests'\n```\n\nYang pertama berakhir dengan exit code 0. Yang kedua berakhir dengan exit code 1. Instalasinya tidak salah. Kamu bertanya ke Python yang lain.\n\nBug yang benar-benar akan kamu temui muncul berikutnya. Untuk mengetahui Python mana yang sedang jalan, banyak skrip membaca variabel shell `VIRTUAL_ENV`, yang hanya ada selama venv diaktifkan. Begini hasilnya.\n\n## Dua file, satu perintah\n\nSimpan ini sebagai `where.py`. Ia memutuskan dengan membaca environment, dan hanya keluar dengan 0 kalau ia yakin sedang berada di venv.\n\n```python\n# where.py\nimport os\nimport sys\n\n\ndef which_interpreter():\n    if os.environ.get(\"VIRTUAL_ENV\"):\n        return \"venv\"\n    return \"system\"\n\n\ndef main():\n    kind = which_interpreter()\n    print(kind)\n    return 0 if kind == \"venv\" else 1\n\n\nraise SystemExit(main())\n```\n\nSimpan ini di sebelahnya sebagai `check_where.py`. Ia membuat venv sekali pakai, menjalankan `where.py` dengan python milik venv dan dengan python sistem, lalu menghitung berapa yang lolos.\n\n```python\n# check_where.py\nimport os\nimport subprocess\nimport sys\nimport tempfile\n\npassed = 0\ntotal = 0\n\n\ndef check(name, ok, detail=\"\"):\n    global passed, total\n    total += 1\n    if ok:\n        passed += 1\n        print(f\"PASS  {name}\")\n    else:\n        print(f\"FAIL  {name}  \u003C- {detail}\")\n\n\nroot = os.path.dirname(os.path.abspath(__file__))\nscript = os.path.join(root, \"where.py\")\n\nhome = tempfile.mkdtemp(prefix=\"venvcheck-\")\nvenv_dir = os.path.join(home, \".venv\")\nsubprocess.run([sys.executable, \"-m\", \"venv\", venv_dir], check=True)\nbindir = \"Scripts\" if os.name == \"nt\" else \"bin\"\nvenv_python = os.path.join(venv_dir, bindir, \"python\" + (\".exe\" if os.name == \"nt\" else \"\"))\n\ninside = subprocess.run([venv_python, script], capture_output=True, text=True)\noutside = subprocess.run([sys.executable, script], capture_output=True, text=True)\n\ncheck(\"where.py runs when a venv calls it\", inside.returncode == 0, f\"exit {inside.returncode}\")\ncheck(\"a venv interpreter reports venv\", inside.stdout.strip() == \"venv\", repr(inside.stdout.strip()))\ncheck(\n    \"the system interpreter reports system\",\n    outside.returncode == 1 and outside.stdout.strip() == \"system\",\n    f\"exit {outside.returncode}, said {outside.stdout.strip()!r}\",\n)\n\nprint()\nprint(f\"{passed} of {total} checks passed\")\nraise SystemExit(0 if passed == total else 1)\n```\n\nJalankan `python3 check_where.py`. Hasilnya exit 1:\n\n```text\nFAIL  where.py runs when a venv calls it  \u003C- exit 1\nFAIL  a venv interpreter reports venv  \u003C- 'system'\nPASS  the system interpreter reports system\n\n1 of 3 checks passed\n```\n\nPython milik venv sendiri yang menjalankan skripnya, dan ia tetap menjawab `system`. `source .venv\u002Fbin\u002Factivate` mengubah shell-mu sehingga `python` berarti venv. Memanggil `.venv\u002Fbin\u002Fpython` langsung tidak pernah menyentuh variabel shell itu, jadi `VIRTUAL_ENV` kosong. Skripnya bertanya ke shell, dan shell tidak pernah diberi tahu.\n\nTanyakan ke interpreter saja. Di dalam venv, `sys.prefix` menunjuk ke venv dan `sys.base_prefix` menunjuk ke Python tempat venv itu dibuat. Ganti `where.py` dengan:\n\n```python\n# where.py\nimport sys\n\n\ndef inside_venv():\n    return sys.prefix != sys.base_prefix\n\n\ndef main():\n    kind = \"venv\" if inside_venv() else \"system\"\n    print(kind)\n    return 0 if kind == \"venv\" else 1\n\n\nraise SystemExit(main())\n```\n\nJalankan `python3 check_where.py` lagi. Hasilnya exit 0:\n\n```text\nPASS  where.py runs when a venv calls it\nPASS  a venv interpreter reports venv\nPASS  the system interpreter reports system\n\n3 of 3 checks passed\n```\n\n## Yang tidak diperiksa\n\nChecker-nya menguji interpreter mana yang sedang jalan. Ia tidak menguji apakah dependensimu sudah yang benar, dan ia tidak mengunci versi. Ia juga tidak bisa melihat interpreter yang dikonfigurasi di editormu, jadi tombol Run tetap butuh pengecekan sendiri.\n\nSaya hanya menjalankannya di Linux. Cabang Windows di checker (`Scripts`, `python.exe`) ada supaya kamu coba sendiri, dan saya tidak memverifikasinya.\n\nSatu jebakan lagi: `pip freeze` di venv yang baru dibuat tidak mencetak apa-apa. File requirements yang kosong bukan bukti bahwa instalasinya rusak. Setelah instalasi `requests` di atas, [`pip freeze`](https:\u002F\u002Fpip.pypa.io\u002Fen\u002Fstable\u002Fcli\u002Fpip_freeze\u002F) mencetak persis ini:\n\n```text\ncertifi==2026.10.23\ncharset-normalizer==3.5.2\nidna==3.20\nrequests==2.34.2\nurllib3==2.8.0\n```\n\n## Jalankan checker dari dalam venv\n\nSekarang jalankan checker yang sama dengan interpreter milik venv: `.venv\u002Fbin\u002Fpython check_where.py`. Satu pengecekan gagal, dan exit code-nya 1:\n\n```text\nPASS  where.py runs when a venv calls it\nPASS  a venv interpreter reports venv\nFAIL  the system interpreter reports system  \u003C- exit 0, said 'venv'\n\n2 of 3 checks passed\n```\n\nChecker membandingkan dengan `sys.executable`. Pada run ini isinya python milik venv, jadi \"interpreter sistem\" tidak pernah benar-benar diuji.\n\nSebelum kamu men-debug import error berikutnya, cetak `sys.executable` dari skrip yang gagal. Python yang mana itu, dan apakah itu yang kamu pasangi package?\n","- `pip install` hanya menyentuh interpreter yang menjalankannya, jadi proyek dengan venv punya dua Python dan paketnya mendarat di salah satunya.\n- `VIRTUAL_ENV` dipasang oleh aktivasi, bukan oleh interpreter, jadi `.venv\u002Fbin\u002Fpython where.py` tetap melaporkan `system`.\n- `sys.prefix != sys.base_prefix` adalah pertanyaan yang harus kamu ajukan ke interpreter itu sendiri, karena nilainya benar tepat ketika venv yang menjalankannya.\n- Checker-nya menguji interpreter mana yang sedang jalan, bukan apakah versi dependensimu sudah benar, dan ia tidak bisa melihat interpreter yang dipakai editor.","\u003Cp>Instalasinya mencetak &quot;Successfully installed&quot;. Skripnya berjalan normal di satu terminal. Lalu tombol Run di editor, atau shell baru, melempar \u003Ccode>ModuleNotFoundError\u003C\u002Fcode> untuk package yang baru saja kamu pasang, di mesin yang sama dan di proyek yang sama.\u003C\u002Fp>\n\u003Cp>Kamu punya dua interpreter di satu mesin, yaitu interpreter sistem dan venv proyekmu, dan \u003Ccode>pip install\u003C\u002Fcode> hanya menyentuh interpreter yang menjalankannya.\u003C\u002Fp>\n\u003Cp>Ini versi yang sudah diukur, di Linux dengan Python 3.14.9 pada 2026-11-07. Modul \u003Ccode>venv\u003C\u002Fcode> sudah bawaan Python, jadi tidak ada yang perlu dipasang lebih dulu (\u003Ca href=\"https:\u002F\u002Fdocs.python.org\u002F3\u002Flibrary\u002Fvenv.html\">dokumentasi venv\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>python3 -m venv .venv\u003C\u002Fcode> menulis venv ke dalam \u003Ccode>.venv\u002F\u003C\u002Fcode>. Mengaktifkannya adalah perubahan pada shell: \u003Ccode>source .venv\u002Fbin\u002Factivate\u003C\u002Fcode> di macOS dan Linux, \u003Ccode>.venv\\Scripts\\activate\u003C\u002Fcode> di Windows. Setelah itu, \u003Ccode>python\u003C\u002Fcode> dan \u003Ccode>pip\u003C\u002Fcode> berarti yang ada di venv. Aktivasi itu praktis, bukan wajib, karena \u003Ccode>.venv\u002Fbin\u002Fpython\u003C\u002Fcode> adalah interpreter yang sama tanpa aktivasi.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">BASH\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20python3%20--version%0APython%203.14.9%0A%24%20python3%20-m%20venv%20.venv%0A%24%20.venv%2Fbin%2Fpip%20install%20requests\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> python3\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --version\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">Python\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 3.14.9\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> python3\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -m\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> venv\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .venv\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .venv\u002Fbin\u002Fpip\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> install\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> requests\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Baris terakhir dari output instalasi:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Successfully%20installed%20certifi-2026.10.23%20charset_normalizer-3.5.2%20idna-3.20%20requests-2.34.2%20urllib3-2.8.0\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Successfully installed certifi-2026.10.23 charset_normalizer-3.5.2 idna-3.20 requests-2.34.2 urllib3-2.8.0\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Satu \u003Ccode>pip install requests\u003C\u002Fcode> menarik lima package, dan \u003Ccode>du -sh .venv\u003C\u002Fcode> melaporkan \u003Ccode>9.3M\u003C\u002Fcode>. Sekarang jalankan probe satu baris yang sama dengan masing-masing interpreter, di mesin yang sama pada detik yang sama:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">CONSOLE\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20.venv%2Fbin%2Fpython%20-c%20%22import%20requests%3B%20print(requests.__version__)%22%0A2.34.2%0A%24%20python3%20-c%20%22import%20requests%3B%20print(requests.__version__)%22%0AModuleNotFoundError%3A%20No%20module%20named%20'requests'\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .venv\u002Fbin\u002Fpython\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -c\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"import requests; print(requests.__version__)\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">2.34.2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> python3\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -c\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"import requests; print(requests.__version__)\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">ModuleNotFoundError:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> No\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> module\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> named\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'requests'\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Yang pertama berakhir dengan exit code 0. Yang kedua berakhir dengan exit code 1. Instalasinya tidak salah. Kamu bertanya ke Python yang lain.\u003C\u002Fp>\n\u003Cp>Bug yang benar-benar akan kamu temui muncul berikutnya. Untuk mengetahui Python mana yang sedang jalan, banyak skrip membaca variabel shell \u003Ccode>VIRTUAL_ENV\u003C\u002Fcode>, yang hanya ada selama venv diaktifkan. Begini hasilnya.\u003C\u002Fp>\n\u003Ch2 id=\"dua-file-satu-perintah\">Dua file, satu perintah\u003C\u002Fh2>\n\u003Cp>Simpan ini sebagai \u003Ccode>where.py\u003C\u002Fcode>. Ia memutuskan dengan membaca environment, dan hanya keluar dengan 0 kalau ia yakin sedang berada di venv.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%23%20where.py%0Aimport%20os%0Aimport%20sys%0A%0A%0Adef%20which_interpreter()%3A%0A%20%20%20%20if%20os.environ.get(%22VIRTUAL_ENV%22)%3A%0A%20%20%20%20%20%20%20%20return%20%22venv%22%0A%20%20%20%20return%20%22system%22%0A%0A%0Adef%20main()%3A%0A%20%20%20%20kind%20%3D%20which_interpreter()%0A%20%20%20%20print(kind)%0A%20%20%20%20return%200%20if%20kind%20%3D%3D%20%22venv%22%20else%201%0A%0A%0Araise%20SystemExit(main())\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># where.py\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> sys\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> which_interpreter\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">():\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.environ.get(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"VIRTUAL_ENV\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"venv\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"system\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> main\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">():\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    kind \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> which_interpreter()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(kind)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> kind \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> else\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">raise\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> SystemExit\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(main())\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Simpan ini di sebelahnya sebagai \u003Ccode>check_where.py\u003C\u002Fcode>. Ia membuat venv sekali pakai, menjalankan \u003Ccode>where.py\u003C\u002Fcode> dengan python milik venv dan dengan python sistem, lalu menghitung berapa yang lolos.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%23%20check_where.py%0Aimport%20os%0Aimport%20subprocess%0Aimport%20sys%0Aimport%20tempfile%0A%0Apassed%20%3D%200%0Atotal%20%3D%200%0A%0A%0Adef%20check(name%2C%20ok%2C%20detail%3D%22%22)%3A%0A%20%20%20%20global%20passed%2C%20total%0A%20%20%20%20total%20%2B%3D%201%0A%20%20%20%20if%20ok%3A%0A%20%20%20%20%20%20%20%20passed%20%2B%3D%201%0A%20%20%20%20%20%20%20%20print(f%22PASS%20%20%7Bname%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print(f%22FAIL%20%20%7Bname%7D%20%20%3C-%20%7Bdetail%7D%22)%0A%0A%0Aroot%20%3D%20os.path.dirname(os.path.abspath(__file__))%0Ascript%20%3D%20os.path.join(root%2C%20%22where.py%22)%0A%0Ahome%20%3D%20tempfile.mkdtemp(prefix%3D%22venvcheck-%22)%0Avenv_dir%20%3D%20os.path.join(home%2C%20%22.venv%22)%0Asubprocess.run(%5Bsys.executable%2C%20%22-m%22%2C%20%22venv%22%2C%20venv_dir%5D%2C%20check%3DTrue)%0Abindir%20%3D%20%22Scripts%22%20if%20os.name%20%3D%3D%20%22nt%22%20else%20%22bin%22%0Avenv_python%20%3D%20os.path.join(venv_dir%2C%20bindir%2C%20%22python%22%20%2B%20(%22.exe%22%20if%20os.name%20%3D%3D%20%22nt%22%20else%20%22%22))%0A%0Ainside%20%3D%20subprocess.run(%5Bvenv_python%2C%20script%5D%2C%20capture_output%3DTrue%2C%20text%3DTrue)%0Aoutside%20%3D%20subprocess.run(%5Bsys.executable%2C%20script%5D%2C%20capture_output%3DTrue%2C%20text%3DTrue)%0A%0Acheck(%22where.py%20runs%20when%20a%20venv%20calls%20it%22%2C%20inside.returncode%20%3D%3D%200%2C%20f%22exit%20%7Binside.returncode%7D%22)%0Acheck(%22a%20venv%20interpreter%20reports%20venv%22%2C%20inside.stdout.strip()%20%3D%3D%20%22venv%22%2C%20repr(inside.stdout.strip()))%0Acheck(%0A%20%20%20%20%22the%20system%20interpreter%20reports%20system%22%2C%0A%20%20%20%20outside.returncode%20%3D%3D%201%20and%20outside.stdout.strip()%20%3D%3D%20%22system%22%2C%0A%20%20%20%20f%22exit%20%7Boutside.returncode%7D%2C%20said%20%7Boutside.stdout.strip()!r%7D%22%2C%0A)%0A%0Aprint()%0Aprint(f%22%7Bpassed%7D%20of%20%7Btotal%7D%20checks%20passed%22)%0Araise%20SystemExit(0%20if%20passed%20%3D%3D%20total%20else%201)\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># check_where.py\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> subprocess\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> sys\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> tempfile\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">passed \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> check\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(name, ok, detail\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    global\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> passed, total\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">+=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ok:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        passed \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">+=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">f\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"PASS  \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">name\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    else\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">f\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"FAIL  \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">name\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">  &#x3C;- \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">detail\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">root \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.path.dirname(os.path.abspath(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">__file__\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">script \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.path.join(root, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"where.py\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">home \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> tempfile.mkdtemp(\u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">prefix\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"venvcheck-\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">venv_dir \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.path.join(home, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\".venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">subprocess.run([sys.executable, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"-m\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, venv_dir], \u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">check\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">bindir \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"Scripts\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.name \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"nt\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> else\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"bin\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">venv_python \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.path.join(venv_dir, bindir, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"python\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\".exe\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> os.name \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"nt\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> else\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">inside \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> subprocess.run([venv_python, script], \u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">capture_output\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">text\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">outside \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> subprocess.run([sys.executable, script], \u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">capture_output\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFAB70\">text\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">check(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"where.py runs when a venv calls it\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, inside.returncode \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">f\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"exit \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">inside.returncode\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">check(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"a venv interpreter reports venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, inside.stdout.strip() \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">repr\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(inside.stdout.strip()))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">check(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"the system interpreter reports system\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    outside.returncode \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> outside.stdout.strip() \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"system\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    f\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"exit \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">outside.returncode\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">, said \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">outside.stdout.strip()\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!r\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">f\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">passed\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> of \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">total\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> checks passed\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">raise\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> SystemExit\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> passed \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">else\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Jalankan \u003Ccode>python3 check_where.py\u003C\u002Fcode>. Hasilnya exit 1:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"FAIL%20%20where.py%20runs%20when%20a%20venv%20calls%20it%20%20%3C-%20exit%201%0AFAIL%20%20a%20venv%20interpreter%20reports%20venv%20%20%3C-%20'system'%0APASS%20%20the%20system%20interpreter%20reports%20system%0A%0A1%20of%203%20checks%20passed\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>FAIL  where.py runs when a venv calls it  &lt;- exit 1\nFAIL  a venv interpreter reports venv  &lt;- 'system'\nPASS  the system interpreter reports system\n\n1 of 3 checks passed\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Python milik venv sendiri yang menjalankan skripnya, dan ia tetap menjawab \u003Ccode>system\u003C\u002Fcode>. \u003Ccode>source .venv\u002Fbin\u002Factivate\u003C\u002Fcode> mengubah shell-mu sehingga \u003Ccode>python\u003C\u002Fcode> berarti venv. Memanggil \u003Ccode>.venv\u002Fbin\u002Fpython\u003C\u002Fcode> langsung tidak pernah menyentuh variabel shell itu, jadi \u003Ccode>VIRTUAL_ENV\u003C\u002Fcode> kosong. Skripnya bertanya ke shell, dan shell tidak pernah diberi tahu.\u003C\u002Fp>\n\u003Cp>Tanyakan ke interpreter saja. Di dalam venv, \u003Ccode>sys.prefix\u003C\u002Fcode> menunjuk ke venv dan \u003Ccode>sys.base_prefix\u003C\u002Fcode> menunjuk ke Python tempat venv itu dibuat. Ganti \u003Ccode>where.py\u003C\u002Fcode> dengan:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%23%20where.py%0Aimport%20sys%0A%0A%0Adef%20inside_venv()%3A%0A%20%20%20%20return%20sys.prefix%20!%3D%20sys.base_prefix%0A%0A%0Adef%20main()%3A%0A%20%20%20%20kind%20%3D%20%22venv%22%20if%20inside_venv()%20else%20%22system%22%0A%20%20%20%20print(kind)%0A%20%20%20%20return%200%20if%20kind%20%3D%3D%20%22venv%22%20else%201%0A%0A%0Araise%20SystemExit(main())\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># where.py\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> sys\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> inside_venv\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">():\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> sys.prefix \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> sys.base_prefix\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> main\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">():\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    kind \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> inside_venv() \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">else\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"system\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(kind)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> kind \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">==\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"venv\"\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> else\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">raise\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> SystemExit\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(main())\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Jalankan \u003Ccode>python3 check_where.py\u003C\u002Fcode> lagi. Hasilnya exit 0:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"PASS%20%20where.py%20runs%20when%20a%20venv%20calls%20it%0APASS%20%20a%20venv%20interpreter%20reports%20venv%0APASS%20%20the%20system%20interpreter%20reports%20system%0A%0A3%20of%203%20checks%20passed\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>PASS  where.py runs when a venv calls it\nPASS  a venv interpreter reports venv\nPASS  the system interpreter reports system\n\n3 of 3 checks passed\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch2 id=\"yang-tidak-diperiksa\">Yang tidak diperiksa\u003C\u002Fh2>\n\u003Cp>Checker-nya menguji interpreter mana yang sedang jalan. Ia tidak menguji apakah dependensimu sudah yang benar, dan ia tidak mengunci versi. Ia juga tidak bisa melihat interpreter yang dikonfigurasi di editormu, jadi tombol Run tetap butuh pengecekan sendiri.\u003C\u002Fp>\n\u003Cp>Saya hanya menjalankannya di Linux. Cabang Windows di checker (\u003Ccode>Scripts\u003C\u002Fcode>, \u003Ccode>python.exe\u003C\u002Fcode>) ada supaya kamu coba sendiri, dan saya tidak memverifikasinya.\u003C\u002Fp>\n\u003Cp>Satu jebakan lagi: \u003Ccode>pip freeze\u003C\u002Fcode> di venv yang baru dibuat tidak mencetak apa-apa. File requirements yang kosong bukan bukti bahwa instalasinya rusak. Setelah instalasi \u003Ccode>requests\u003C\u002Fcode> di atas, \u003Ca href=\"https:\u002F\u002Fpip.pypa.io\u002Fen\u002Fstable\u002Fcli\u002Fpip_freeze\u002F\">\u003Ccode>pip freeze\u003C\u002Fcode>\u003C\u002Fa> mencetak persis ini:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"certifi%3D%3D2026.10.23%0Acharset-normalizer%3D%3D3.5.2%0Aidna%3D%3D3.20%0Arequests%3D%3D2.34.2%0Aurllib3%3D%3D2.8.0\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>certifi==2026.10.23\ncharset-normalizer==3.5.2\nidna==3.20\nrequests==2.34.2\nurllib3==2.8.0\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch2 id=\"jalankan-checker-dari-dalam-venv\">Jalankan checker dari dalam venv\u003C\u002Fh2>\n\u003Cp>Sekarang jalankan checker yang sama dengan interpreter milik venv: \u003Ccode>.venv\u002Fbin\u002Fpython check_where.py\u003C\u002Fcode>. Satu pengecekan gagal, dan exit code-nya 1:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"PASS%20%20where.py%20runs%20when%20a%20venv%20calls%20it%0APASS%20%20a%20venv%20interpreter%20reports%20venv%0AFAIL%20%20the%20system%20interpreter%20reports%20system%20%20%3C-%20exit%200%2C%20said%20'venv'%0A%0A2%20of%203%20checks%20passed\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>PASS  where.py runs when a venv calls it\nPASS  a venv interpreter reports venv\nFAIL  the system interpreter reports system  &lt;- exit 0, said 'venv'\n\n2 of 3 checks passed\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Checker membandingkan dengan \u003Ccode>sys.executable\u003C\u002Fcode>. Pada run ini isinya python milik venv, jadi &quot;interpreter sistem&quot; tidak pernah benar-benar diuji.\u003C\u002Fp>\n\u003Cp>Sebelum kamu men-debug import error berikutnya, cetak \u003Ccode>sys.executable\u003C\u002Fcode> dari skrip yang gagal. Python yang mana itu, dan apakah itu yang kamu pasangi package?\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>\u003Ccode>pip install\u003C\u002Fcode> hanya menyentuh interpreter yang menjalankannya, jadi proyek dengan venv punya dua Python dan paketnya mendarat di salah satunya.\u003C\u002Fli>\n\u003Cli>\u003Ccode>VIRTUAL_ENV\u003C\u002Fcode> dipasang oleh aktivasi, bukan oleh interpreter, jadi \u003Ccode>.venv\u002Fbin\u002Fpython where.py\u003C\u002Fcode> tetap melaporkan \u003Ccode>system\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>sys.prefix != sys.base_prefix\u003C\u002Fcode> adalah pertanyaan yang harus kamu ajukan ke interpreter itu sendiri, karena nilainya benar tepat ketika venv yang menjalankannya.\u003C\u002Fli>\n\u003Cli>Checker-nya menguji interpreter mana yang sedang jalan, bukan apakah versi dependensimu sudah benar, dan ia tidak bisa melihat interpreter yang dipakai editor.\u003C\u002Fli>\n\u003C\u002Ful>\n",[194,216,235,252,257,272],{"id":195,"title":196,"title_id":197,"slug":198,"excerpt":199,"excerpt_id":200,"has_translation":12,"published_at":201,"reading_time":100,"hidden_from_listing":15,"tags":202,"thumbnail_image":21,"og_image":207,"series":208,"authors":213},48,"What a Linked List Actually Is","Tentang Struktur Data LinkedList","tentang-struktur-data-linked-list","A linked list is a linear chain of nodes, each holding data and a pointer to the next node. Here is what that chain looks like, what it costs next to an array, and the same minimal implementation in Java, Python, and JavaScript.","Linked list adalah rantai linear berisi node, dan setiap node menyimpan data plus pointer ke node berikutnya. Ini bentuk rantainya, ongkosnya dibanding array, dan implementasi paling sederhana dalam Java, Python, serta JavaScript.","2026-11-21T01:00:00.000Z",[203,204,205,206],"struktur-data","linked-list","pointer","konsep","\u002Fog\u002Ftentang-struktur-data-linked-list.png",{"id":209,"title":210,"title_id":211,"slug":212},28,"Linear Data Structures","Struktur Data Linear","asd-struktur-linear",[214],{"authors_id":215},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":217,"title":218,"title_id":219,"slug":220,"excerpt":221,"excerpt_id":222,"has_translation":12,"published_at":223,"reading_time":137,"hidden_from_listing":15,"tags":224,"thumbnail_image":21,"og_image":226,"series":227,"authors":232},47,"Why Understanding Algorithms and Data Structures Actually Matters","Pentingnya Memahami Algoritma dan Struktur Data","pentingnya-memahami-algoritma-dan-struktur-data","An algorithm is an ordered list of steps, and that order decides how expensive a problem is. The examples are on the back of an instant noodle packet, in a factorial, and behind ctrl+z.","Sebagai konsep fundamental, algoritma menentukan seberapa mahal sebuah masalah diselesaikan. Contohnya ada di bungkus mie instan, di bilangan faktorial, dan di tombol undo.","2026-11-19T01:00:00.000Z",[225,203,206,123],"algoritma","\u002Fog\u002Fpentingnya-memahami-algoritma-dan-struktur-data.png",{"id":228,"title":229,"title_id":230,"slug":231},27,"About Algorithms and Data Structures","Tentang Algoritma dan Struktur Data","asd-intro",[233],{"authors_id":234},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":236,"title":237,"title_id":238,"slug":239,"excerpt":240,"excerpt_id":241,"has_translation":12,"published_at":242,"reading_time":14,"hidden_from_listing":15,"tags":243,"thumbnail_image":21,"og_image":247,"series":248,"authors":249},108,"At 11 a.m. the AI Quota Runs Out, and the Work Stops There","Jam 11 siang kuota AI-nya habis, dan kerjaan berhenti di situ","jam-11-kuota-ai-habis-kerjaan-berhenti","The panel says the usage limit is reached and the work stops, not because it is finished. Three guesses explain it, and all three are wrong: the limit is shaped like a cliff, and the day is built on top of one tool.","Panel di layar bilang batas pemakaian tercapai, dan kerja berhenti di situ. Bukan karena selesai. Ada tiga tebakan kenapa ini terjadi, dan ketiganya salah: batasnya berbentuk tebing, dan harinya dibangun di atas satu alat.","2026-11-12T01:00:00.000Z",[244,102,245,246],"ai","rate-limit","produktivitas","\u002Fog\u002Fjam-11-kuota-ai-habis-kerjaan-berhenti.png",{"id":24,"title":25,"title_id":26,"slug":27},[250],{"authors_id":251},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":74,"title":146,"title_id":75,"slug":76,"excerpt":147,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":83,"series":253,"authors":254},{"id":85,"title":86,"title_id":87,"slug":88},[255],{"authors_id":256},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":258,"title":259,"title_id":260,"slug":261,"excerpt":262,"excerpt_id":263,"has_translation":12,"published_at":264,"reading_time":14,"hidden_from_listing":15,"tags":265,"thumbnail_image":21,"og_image":267,"series":268,"authors":269},139,"Python Classes: the History Every Account Shared","Python Class: Riwayat yang Dipakai Bersama Semua Akun","python-class-object","Two accounts, and each history lists the other account's deposits. The list sat in the class body, `append` never writes to the object, so both accounts appended into the same one.","Dua akun, dan riwayat masing-masing memuat setoran akun lain. List-nya duduk di body class, `append` tidak pernah menulis ke objek, jadi kedua akun menambah ke list yang sama.","2026-11-07T01:00:00.000Z",[80,266],"oop","\u002Fog\u002Fpython-class-object.png",{"id":154,"title":52,"title_id":53,"slug":54},[270],{"authors_id":271},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":273,"title":274,"title_id":275,"slug":276,"excerpt":277,"excerpt_id":278,"has_translation":12,"published_at":136,"reading_time":14,"hidden_from_listing":15,"tags":279,"thumbnail_image":21,"og_image":282,"series":283,"authors":286},137,"Java Operators: the Average That Came Out a Whole Number","Operator Java: Rata-Rata yang Keluar Sebagai Bilangan Bulat","java-operators","Three scores, one division, and the average prints as 82. Both operands are `int`, so the fraction is cut off, and the obvious cast prints `82.0` without fixing anything.","Tiga nilai, satu pembagian, dan rata-ratanya tercetak 82. Kedua operand-nya `int`, jadi pecahannya dipotong, dan cast yang paling wajar malah mencetak `82.0` tanpa memperbaiki apa pun.",[280,281],"java","operator","\u002Fog\u002Fjava-operators.png",{"id":284,"title":164,"title_id":165,"slug":285},22,"java-variabel-tipe-data",[287],{"authors_id":288},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},[290,294,297],{"text":291,"depth":292,"id":293},"Dua file, satu perintah",2,"dua-file-satu-perintah",{"text":295,"depth":292,"id":296},"Yang tidak diperiksa","yang-tidak-diperiksa",{"text":298,"depth":292,"id":299},"Jalankan checker dari dalam venv","jalankan-checker-dari-dalam-venv",1794054568052]