{"id":329,"date":"2026-07-08T15:34:24","date_gmt":"2026-07-08T07:34:24","guid":{"rendered":"https:\/\/numsimlab.com\/?p=329"},"modified":"2026-07-08T15:34:24","modified_gmt":"2026-07-08T07:34:24","slug":"env-%e6%96%87%e4%bb%b6%e5%85%a8%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=329","title":{"rendered":".env \u6587\u4ef6\u5168\u6d41\u7a0b\u6559\u7a0b"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>.env \u6587\u4ef6\u5168\u6d41\u7a0b\u6559\u7a0b \u00b7 Env File Full Guide<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.bad h4{color:var(--accent3)}\n.compare-col.good h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink)}\nfooter{max-width:var(--max-w);margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap:wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\u2699\ufe0f<\/span> .env \u6587\u4ef6\u5168\u94fe\u8def\u6559\u7a0b<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<main>\n<!-- \u4e2d\u6587\u6559\u7a0b -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>.env \u6587\u4ef6\u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b\uff08\u5f00\u53d1\u2192\u6253\u5305\u2192\u90e8\u7f72\u5168\u94fe\u8def\uff09<\/h1>\n  <p>\u4ec0\u4e48\u662f.env\u3001\u8bed\u6cd5\u3001python-dotenv\u4f7f\u7528\u3001git\u89c4\u8303\u3001\u6253\u5305\u5206\u53d1\u3001\u5bb9\u5668\u90e8\u7f72\u3001\u751f\u4ea7\u5b89\u5168\u89c4\u8303\u5168\u8986\u76d6<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-1\">\u4e00\u3001\u4ec0\u4e48\u662f .env \u6587\u4ef6\uff0c\u89e3\u51b3\u4ec0\u4e48\u6838\u5fc3\u95ee\u9898<\/a><\/li>\n    <li><a href=\"#zh-2\">\u4e8c\u3001.env \u57fa\u7840\u8bed\u6cd5\u4e0e\u6587\u4ef6\u89c4\u8303<\/a><\/li>\n    <li><a href=\"#zh-3\">\u4e09\u3001Python\u8bfb\u53d6.env\uff1apython-dotenv\u5b8c\u6574\u4f7f\u7528<\/a><\/li>\n    <li><a href=\"#zh-4\">\u56db\u3001\u5f00\u53d1\u9636\u6bb5\uff1a\u591a\u73af\u5883 .env \u533a\u5206\uff08dev\/test\/prod\uff09<\/a><\/li>\n    <li><a href=\"#zh-5\">\u4e94\u3001\u4ee3\u7801\u4ed3\u5e93 Git \u7ba1\u7406 .env\uff08.env.example\u6a21\u677f\uff09<\/a><\/li>\n    <li><a href=\"#zh-6\">\u516d\u3001\u9879\u76ee\u6253\u5305\u73af\u8282\u5904\u7406 .env<\/a><\/li>\n    <li><a href=\"#zh-7\">\u4e03\u3001\u5e94\u7528\u90e8\u7f72\u5168\u94fe\u8def\uff1a\u672c\u5730\/\u670d\u52a1\u5668\/Docker\/K8s<\/a><\/li>\n    <li><a href=\"#zh-8\">\u516b\u3001\u751f\u4ea7\u73af\u5883\u5b89\u5168\u7ea2\u7ebf\uff08\u7981\u6b62\u786c\u7f16\u7801\u5bc6\u94a5\uff09<\/a><\/li>\n    <li><a href=\"#zh-9\">\u4e5d\u3001\u9ad8\u9891\u8e29\u5751\u4e0e\u89e3\u51b3\u65b9\u6848<\/a><\/li>\n    <li><a href=\"#zh-10\">\u5341\u3001\u5168\u6d41\u7a0b\u6807\u51c6\u843d\u5730\u6a21\u677f<\/a><\/li>\n  <\/ol>\n<\/div>\n<h2 id=\"zh-1\">\u4e00\u3001\u4ec0\u4e48\u662f .env \u6587\u4ef6\uff0c\u89e3\u51b3\u4ec0\u4e48\u6838\u5fc3\u95ee\u9898<\/h2>\n<p>.env \u5168\u79f0 environment\uff08\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff09\uff0c\u662f\u7eaf\u6587\u672c\u65e0\u540e\u7f00\u9690\u85cf\u6587\u4ef6\uff0c\u4e13\u95e8\u5b58\u653e\u7a0b\u5e8f<strong>\u73af\u5883\u53d8\u91cf<\/strong>\u3002<\/p>\n<div class=\"info-box\">\n  <strong>\u6838\u5fc3\u4f5c\u7528\uff1a\u9694\u79bb\u654f\u611f\u4fe1\u606f\u4e0e\u73af\u5883\u914d\u7f6e\uff0c\u7981\u6b62\u628a\u5bc6\u7801\u3001\u5bc6\u94a5\u3001\u6570\u636e\u5e93\u5730\u5740\u5199\u6b7b\u5728\u4ee3\u7801\u91cc\u3002<\/strong>\n<\/div>\n<div class=\"compare-box\">\n  <div class=\"compare-col bad\">\n    <h4>\u274c \u786c\u7f16\u7801\uff08\u81f4\u547d\u9519\u8bef\uff09<\/h4>\n<pre class=\"example\"># db.py\nDB_HOST = \"127.0.0.1\"\nDB_USER = \"root\"\nDB_PWD = \"123456\"  # \u5bc6\u7801\u660e\u6587\u5199\u4ee3\u7801\nAPI_KEY = \"sk-xxx\u5bc6\u94a5\"\n<\/pre>\n    <p>\u4e0a\u4f20\u4ee3\u7801\u5230Git\u4f1a\u6cc4\u9732\u8d26\u53f7\u5bc6\u94a5\uff0c\u5f00\u53d1\/\u751f\u4ea7\u73af\u5883\u5207\u6362\u9700\u8981\u6539\u4ee3\u7801\u3001\u91cd\u65b0\u6253\u5305\u3002<\/p>\n  <\/div>\n  <div class=\"compare-col good\">\n    <h4>\u2705 \u4f7f\u7528 .env \u89c4\u8303\u65b9\u6848<\/h4>\n<pre class=\"example\"># .env\nDB_HOST=127.0.0.1\nDB_USER=root\nDB_PWD=123456\nAPI_KEY=sk-xxx\u5bc6\u94a5\n# db.py \u4ece\u73af\u5883\u8bfb\u53d6\uff0c\u65e0\u660e\u6587\u5bc6\u7801\nimport os\nDB_PWD = os.getenv(\"DB_PWD\")\n<\/pre>\n    <p>\u914d\u7f6e\u4e0e\u4ee3\u7801\u5b8c\u5168\u5206\u79bb\uff0c\u5207\u6362\u73af\u5883\u4ec5\u66ff\u6362.env\uff0c\u5bc6\u94a5\u4e0d\u4f1a\u63d0\u4ea4\u4ee3\u7801\u4ed3\u5e93\u3002<\/p>\n  <\/div>\n<\/div>\n<div class=\"card\">\n  <h4>.env \u56db\u5927\u6838\u5fc3\u4ef7\u503c<\/h4>\n  <p><span class=\"tag-r\">\u5b89\u5168\u9694\u79bb<\/span> \u6570\u636e\u5e93\u5bc6\u7801\u3001API\u5bc6\u94a5\u3001token\u4e0d\u5b58\u5165\u4ee3\u7801\u4ed3\u5e93<\/p>\n  <p><span class=\"tag-g\">\u591a\u73af\u5883\u5207\u6362<\/span> dev\/test\/prod\u4e09\u5957\u914d\u7f6e\u4e00\u952e\u5207\u6362<\/p>\n  <p><span class=\"tag-b\">\u7edf\u4e00\u6807\u51c6<\/span> Python\/JS\/Go\/Docker\u5168\u751f\u6001\u901a\u7528<\/p>\n  <p><span class=\"tag-y\">\u90e8\u7f72\u517c\u5bb9<\/span> \u672c\u5730\u5f00\u53d1\u3001\u670d\u52a1\u5668\u3001\u5bb9\u5668\u5171\u7528\u4e00\u5957\u53d8\u91cf\u540d<\/p>\n<\/div>\n<h2 id=\"zh-2\">\u4e8c\u3001.env \u57fa\u7840\u8bed\u6cd5\u4e0e\u6587\u4ef6\u89c4\u8303<\/h2>\n<div class=\"info-box warn\">\n  <strong>\u786c\u6027\u8bed\u6cd5\u89c4\u5219\uff1a\u952e=\u503c\uff0c\u7b49\u53f7\u4e24\u4fa7\u4e0d\u80fd\u7a7a\u683c\uff1b#\u4e3a\u6ce8\u91ca\uff1b\u5b57\u7b26\u4e32\u4e0d\u9700\u8981\u5f15\u53f7\uff08\u6709\u7a7a\u683c\u624d\u52a0\u53cc\u5f15\u53f7\uff09<\/strong>\n<\/div>\n<h3>2.1 \u6807\u51c6 .env \u793a\u4f8b<\/h3>\n<pre class=\"code-block\"># \u6570\u636e\u5e93\u914d\u7f6e\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_USER=root\nDB_PASSWORD=Root@123456\n\n# \u5e03\u5c14\/\u6570\u5b57\nDEBUG=true\nSERVER_PORT=8000\nTIMEOUT=30\n\n# \u5e26\u7a7a\u683c\u5b57\u7b26\u4e32\u5fc5\u987b\u53cc\u5f15\u53f7\nAPP_NAME=\"\u540e\u7aef\u6f14\u793a\u670d\u52a1\"\n\n# \u7a7a\u53d8\u91cf\nREDIS_PASSWORD=\n\n# \u591a\u503c\u6570\u7ec4\uff08\u9017\u53f7\u5206\u9694\uff0c\u4ee3\u7801\u81ea\u884c\u62c6\u5206\uff09\nALLOW_ORIGIN=\"http:\/\/localhost:3000,https:\/\/prod.com\"\n<\/pre>\n<h3>2.2 \u914d\u5957\u6a21\u677f\u6587\u4ef6 .env.example<\/h3>\n<p>\u6838\u5fc3\u89c4\u8303\uff1a.env \u7981\u6b62\u4e0a\u4f20Git\uff0c\u5fc5\u987b\u63d0\u4f9b\u6a21\u677f <code>.env.example<\/code>\uff0c\u4ec5\u4fdd\u7559\u53d8\u91cf\u540d\uff0c\u5220\u9664\u771f\u5b9e\u5bc6\u94a5\u3002<\/p>\n<pre class=\"code-block\"># .env.example\uff08\u53ef\u63d0\u4ea4git\uff09\nDB_HOST=\u586b\u5199\u6570\u636e\u5e93\u5730\u5740\nDB_PORT=3306\nDB_USER=root\nDB_PASSWORD=\u8bf7\u586b\u5199\u6570\u636e\u5e93\u5bc6\u7801\nAPI_KEY=\u7b2c\u4e09\u65b9\u5bc6\u94a5\u7559\u7a7a\u5f85\u586b\u5145\n<\/pre>\n<h3>2.3 \u591a\u73af\u5883\u6587\u4ef6\u547d\u540d\u89c4\u8303<\/h3>\n<ul>\n  <li>.env.dev \u672c\u5730\u5f00\u53d1\u73af\u5883<\/li>\n  <li>.env.test \u6d4b\u8bd5\u670d\u52a1\u5668\u73af\u5883<\/li>\n  <li>.env.prod \u751f\u4ea7\u670d\u52a1\u5668\u73af\u5883<\/li>\n  <li>.env \u515c\u5e95\u9ed8\u8ba4\u914d\u7f6e<\/li>\n<\/ul>\n<h2 id=\"zh-3\">\u4e09\u3001Python\u8bfb\u53d6.env\uff1apython-dotenv\u5b8c\u6574\u4f7f\u7528<\/h2>\n<p>Python\u539f\u751fos\u53ea\u80fd\u8bfb\u53d6\u7cfb\u7edf\u73af\u5883\u53d8\u91cf\uff0c\u8bfb\u53d6\u672c\u5730.env\u6587\u4ef6\u9700\u8981\u7b2c\u4e09\u65b9\u5e93 <code>python-dotenv<\/code><\/p>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>\u5b89\u88c5\u4f9d\u8d56<\/h4>\n    <div class=\"cmd\">pip install python-dotenv<\/div>\n    <div class=\"desc\">\u5199\u5165pyproject.toml dev\u4f9d\u8d56<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>\u57fa\u7840\u52a0\u8f7d .env<\/h4>\n    <div class=\"cmd\">from dotenv import load_dotenv\nload_dotenv()\nimport os\nprint(os.getenv(&#8220;DB_HOST&#8221;))<\/div>\n    <div class=\"desc\">\u81ea\u52a8\u8bfb\u53d6\u9879\u76ee\u6839\u76ee\u5f55.env<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>\u6307\u5b9a\u73af\u5883\u6587\u4ef6<\/h4>\n    <div class=\"cmd\">load_dotenv(&#8220;.env.prod&#8221;)<\/div>\n    <div class=\"desc\">\u624b\u52a8\u52a0\u8f7d\u751f\u4ea7\u914d\u7f6e\u6587\u4ef6<\/div>\n  <\/div>\n<\/div>\n<h3>3.1 \u6700\u7b80\u8bfb\u53d6\u4ee3\u7801<\/h3>\n<pre class=\"code-block\"># config.py \u5168\u5c40\u914d\u7f6e\u6587\u4ef6\nfrom dotenv import load_dotenv\nimport os\n# \u52a0\u8f7d\u6839\u76ee\u5f55.env\uff0c\u4f1a\u628a\u53d8\u91cf\u6ce8\u5165\u7cfb\u7edf\u73af\u5883\nload_dotenv()\n\n# \u8bfb\u53d6\u73af\u5883\u53d8\u91cf\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4e3a\u9ed8\u8ba4\u503c\nDB_HOST = os.getenv(\"DB_HOST\", \"127.0.0.1\")\nDB_PORT = int(os.getenv(\"DB_PORT\", 3306))\nDEBUG = os.getenv(\"DEBUG\", \"false\") == \"true\"\nAPI_KEY = os.getenv(\"API_KEY\")\n\n# \u7f3a\u5931\u5bc6\u94a5\u76f4\u63a5\u629b\u51fa\u5f02\u5e38\uff0c\u963b\u65ad\u7a0b\u5e8f\u542f\u52a8\nif not API_KEY:\n    raise ValueError(\"\u7f3a\u5c11API_KEY\u73af\u5883\u53d8\u91cf\uff0c\u8bf7\u68c0\u67e5.env\u6587\u4ef6\")\n<\/pre>\n<h3>3.2 \u591a\u73af\u5883\u52a8\u6001\u52a0\u8f7d\uff08\u5f00\u53d1\u5e38\u7528\uff09<\/h3>\n<pre class=\"code-block\">from dotenv import load_dotenv\nimport os\n\n# \u901a\u8fc7\u73af\u5883\u53d8\u91cf\u533a\u5206\u5f53\u524d\u73af\u5883\uff0c\u672c\u5730\/CI\/\u670d\u52a1\u5668\u901a\u7528\nenv_mode = os.getenv(\"ENV_MODE\", \"dev\")\nenv_file = f\".env.{env_mode}\"\nload_dotenv(env_file)\nprint(f\"\u5f53\u524d\u52a0\u8f7d\u73af\u5883\u914d\u7f6e\uff1a{env_file}\")\n<\/pre>\n<p>\u672c\u5730\u542f\u52a8\u547d\u4ee4\uff1a<code>ENV_MODE=dev python main.py<\/code><\/p>\n<h2 id=\"zh-4\">\u56db\u3001\u5f00\u53d1\u9636\u6bb5\u5b8c\u6574\u6d41\u7a0b<\/h2>\n<ol class=\"steps\">\n  <li>\u9879\u76ee\u6839\u76ee\u5f55\u65b0\u5efa <code>.env.example<\/code> \u6a21\u677f\uff0c\u6240\u6709\u53d8\u91cf\u540d\u9f50\u5168\uff0c\u65e0\u771f\u5b9e\u5bc6\u7801<\/li>\n  <li>\u590d\u5236\u6a21\u677f\u4e3a <code>.env.dev<\/code>\uff0c\u586b\u5145\u672c\u5730\u6570\u636e\u5e93\u3001\u6d4b\u8bd5\u5bc6\u94a5<\/li>\n  <li>.gitignore \u5199\u5165 .env* \u5c4f\u853d\u6240\u6709\u73af\u5883\u6587\u4ef6\uff0c\u4ec5\u653e\u884c .env.example<\/li>\n  <li>\u4ee3\u7801\u7edf\u4e00\u901a\u8fc7 config.py \u8bfb\u53d6\u73af\u5883\u53d8\u91cf\uff0c\u5168\u7a0b\u65e0\u786c\u7f16\u7801<\/li>\n  <li>\u5207\u6362\u73af\u5883\u53ea\u9700\u4fee\u6539\u542f\u52a8\u65f6 ENV_MODE \u53c2\u6570\uff0c\u4e0d\u7528\u6539\u4ee3\u7801<\/li>\n<\/ol>\n<h3>.gitignore \u6807\u51c6\u914d\u7f6e<\/h3>\n<pre class=\"code-block\"># \u5c4f\u853d\u6240\u6709\u771f\u5b9e\u73af\u5883\u6587\u4ef6\n.env\n.env.dev\n.env.test\n.env.prod\n# \u4ec5\u4fdd\u7559\u6a21\u677f\u6587\u4ef6\u4e0d\u5c4f\u853d\n!.env.example\n<\/pre>\n<h2 id=\"zh-5\">\u4e94\u3001Git\u4ed3\u5e93\u7ba1\u7406\u89c4\u8303\uff08\u5b89\u5168\u6838\u5fc3\uff09<\/h2>\n<div class=\"card\">\n  <h4>Git\u4e09\u6761\u94c1\u5f8b<\/h4>\n  <p>1. \u6240\u6709 .env\u3001.env.* \u7981\u6b62\u63d0\u4ea4\u5230\u8fdc\u7a0b\u4ed3\u5e93<\/p>\n  <p>2. \u5fc5\u987b\u63d0\u4ea4 .env.example \u6a21\u677f\uff0c\u4fdd\u8bc1\u65b0\u4eba\u62c9\u53d6\u9879\u76ee\u53ef\u76f4\u63a5\u590d\u5236\u4f7f\u7528<\/p>\n  <p>3. \u4efb\u4f55\u5bc6\u7801\u3001token\u3001\u79c1\u94a5\u7edd\u4e0d\u5199\u5165\u4ee3\u7801\u3001\u6ce8\u91ca\u3001\u63d0\u4ea4\u8bb0\u5f55<\/p>\n<\/div>\n<div class=\"info-box danger\">\n  <strong>\u9ad8\u5371\u8b66\u544a\uff1a\u4e00\u65e6\u8bef\u63d0\u4ea4.env\u542b\u5bc6\u94a5\u6587\u4ef6\uff0c\u5373\u4f7f\u5220\u9664\u63d0\u4ea4\u8bb0\u5f55\uff0cGit\u5386\u53f2\u4ecd\u5b58\u5728\u6cc4\u9732\u98ce\u9669\uff0c\u5fc5\u987b\u91cd\u7f6e\u4ed3\u5e93\u6216\u8f6e\u6362\u6240\u6709\u5bc6\u94a5\uff01<\/strong>\n<\/div>\n<h2 id=\"zh-6\">\u516d\u3001\u9879\u76ee\u6253\u5305\u73af\u8282\u5904\u7406 .env<\/h2>\n<h3>\u573a\u666f1\uff1a\u6e90\u7801\u6253\u5305\uff08sdist\/uv build\uff09<\/h3>\n<p>\u6253\u5305\u5de5\u5177\u9ed8\u8ba4\u4e0d\u4f1a\u6253\u5305 .env \u6587\u4ef6\uff0c\u53ea\u4f1a\u6253\u5305\u4ee3\u7801\u4e0epyproject.toml\uff0c\u4e0d\u4f1a\u6cc4\u9732\u672c\u5730\u5bc6\u94a5\uff1b\u5206\u53d1\u6e90\u7801\u5305\u7ed9\u4ed6\u4eba\uff0c\u5bf9\u65b9\u590d\u5236.env.example\u4f7f\u7528\u3002<\/p>\n<h3>\u573a\u666f2\uff1aexe\u6253\u5305\uff08PyInstaller\uff09<\/h3>\n<ol class=\"steps\">\n  <li>\u6253\u5305\u65f6\u4e0d\u8981\u5c06\u672c\u5730.env\u6253\u8fdbexe\uff0c\u907f\u514d\u672c\u673a\u5bc6\u7801\u968f\u7a0b\u5e8f\u5206\u53d1<\/li>\n  <li>\u7a0b\u5e8f\u8fd0\u884c\u76ee\u5f55\u5916\u7f6e.env\uff0c\u7531\u4f7f\u7528\u8005\u81ea\u884c\u586b\u5199\u914d\u7f6e<\/li>\n  <li>\u6253\u5305\u811a\u672c\u6392\u9664.env\u6587\u4ef6\uff1a&#8211;exclude .env<\/li>\n<\/ol>\n<pre class=\"terminal\">pyinstaller main.py --exclude .env<\/pre>\n<h3>\u573a\u666f3\uff1aDocker\u955c\u50cf\u6253\u5305<\/h3>\n<p>Dockerfile\u4e2d\u7edd\u5bf9\u4e0d\u80fdCOPY .env\u8fdb\u5165\u955c\u50cf\uff0c\u955c\u50cf\u63a8\u9001\u4ed3\u5e93\u4f1a\u6cc4\u9732\u5bc6\u94a5\uff1b\u4e24\u79cd\u6807\u51c6\u65b9\u6848\uff1a<\/p>\n<ol>\n  <li>\u65b9\u68481\uff1a\u8fd0\u884c\u5bb9\u5668\u65f6\u901a\u8fc7 -e \/ &#8211;env-file \u5916\u90e8\u4f20\u5165.env<\/li>\n  <li>\u65b9\u68482\uff1a\u751f\u4ea7\u4f7f\u7528K8s ConfigMap\/Secret\u7ba1\u7406\u73af\u5883\u53d8\u91cf<\/li>\n<\/ol>\n<h2 id=\"zh-7\">\u4e03\u3001\u90e8\u7f72\u5168\u94fe\u8def\u5b8c\u6574\u65b9\u6848\uff08\u672c\u5730\u2192\u670d\u52a1\u5668\u2192Docker\u2192K8s\uff09<\/h2>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">\u672c\u5730\u5f00\u53d1<\/span>\n    <span class=\"flow-arrow\">.env.dev<\/span>\n    <span class=\"flow-item yellow\">\u6d4b\u8bd5\u670d\u52a1\u5668<\/span>\n    <span class=\"flow-arrow\">.env.test<\/span>\n    <span class=\"flow-item purple\">\u751f\u4ea7\u5bb9\u5668<\/span>\n    <span class=\"flow-arrow\">\u73af\u5883\u53d8\u91cf\u6ce8\u5165<\/span>\n    <span class=\"flow-item blue\">\u7ebf\u4e0a\u8fd0\u884c<\/span>\n  <\/div>\n<\/div>\n<h3>7.1 \u672c\u5730\u5f00\u53d1\uff08\u7535\u8111\uff09<\/h3>\n<p>\u4f7f\u7528.env.dev\uff0cload_dotenv\u81ea\u52a8\u52a0\u8f7d\uff0c\u6240\u6709\u914d\u7f6e\u672c\u5730\u5b58\u50a8\uff0c\u4e0d\u4e0a\u4f20Git<\/p>\n<h3>7.2 \u7269\u7406\u4e91\u670d\u52a1\u5668\u90e8\u7f72<\/h3>\n<ol class=\"steps\">\n  <li>\u670d\u52a1\u5668\u9879\u76ee\u76ee\u5f55\u65b0\u5efa .env.prod\uff0c\u586b\u5165\u7ebf\u4e0a\u6570\u636e\u5e93\u3001\u751f\u4ea7\u5bc6\u94a5<\/li>\n  <li>\u8bbe\u7f6e\u6587\u4ef6\u6743\u9650\uff1achmod 600 .env.prod \u4ec5root\u53ef\u8bfb\uff0c\u9632\u6b62\u5176\u4ed6\u7528\u6237\u8bfb\u53d6\u5bc6\u94a5<\/li>\n  <li>\u542f\u52a8\u811a\u672c\u6307\u5b9a\u52a0\u8f7d\u751f\u4ea7\u73af\u5883\uff1aENV_MODE=prod python main.py<\/li>\n  <li>\u670d\u52a1\u5668\u4e0d\u63d0\u4ea4.env\u5230\u4ee3\u7801\u4ed3\u5e93\uff0c\u5355\u72ec\u8fd0\u7ef4\u4fdd\u7ba1<\/li>\n<\/ol>\n<h3>7.3 Docker \u5bb9\u5668\u90e8\u7f72<\/h3>\n<h4>\u9519\u8bef\u5199\u6cd5\uff08\u5bc6\u94a5\u6253\u8fdb\u955c\u50cf\uff09<\/h4>\n<pre class=\"example\"># Dockerfile \u7981\u6b62\u8fd9\u4e48\u5199\nCOPY .env .\n<\/pre>\n<h4>\u6b63\u786e\u8fd0\u884c\u65b9\u5f0f\uff08\u5916\u90e8\u6ce8\u5165\uff09<\/h4>\n<pre class=\"terminal\"># \u5916\u90e8\u4f20\u5165\u73af\u5883\u6587\u4ef6\uff0c\u955c\u50cf\u4e0d\u542b\u5bc6\u94a5\ndocker run --env-file .env.prod -p 8000:8000 app:latest\n# \u5355\u72ec\u4f20\u5165\u5355\u4e2a\u53d8\u91cf\ndocker run -e DB_HOST=10.0.0.1 app:latest\n<\/pre>\n<h3>7.4 Kubernetes \u751f\u4ea7\u96c6\u7fa4<\/h3>\n<p>\u751f\u4ea7\u7981\u6b62\u4f7f\u7528.env\u6587\u4ef6\uff0c\u7edf\u4e00\u4f7f\u7528K8s Secret\u5b58\u50a8\u5bc6\u94a5\u3001ConfigMap\u5b58\u50a8\u666e\u901a\u914d\u7f6e\uff0c\u96c6\u7fa4\u81ea\u52a8\u6ce8\u5165\u5bb9\u5668\u73af\u5883\u53d8\u91cf\uff0c\u5bc6\u94a5\u52a0\u5bc6\u5b58\u50a8\uff0c\u4e0d\u843d\u5730\u6587\u4ef6\u3002<\/p>\n<h2 id=\"zh-8\">\u516b\u3001\u751f\u4ea7\u73af\u5883\u5b89\u5168\u7ea2\u7ebf<\/h2>\n<div class=\"card\">\n  <h4>\u7edd\u5bf9\u7981\u6b62\u64cd\u4f5c<\/h4>\n  <p>\u274c \u4ee3\u7801\u3001\u6ce8\u91ca\u3001\u63d0\u4ea4\u8bb0\u5f55\u5199\u6570\u636e\u5e93\u5bc6\u7801\u3001API\u5bc6\u94a5<\/p>\n  <p>\u274c \u5c06.env\u6253\u5305\u8fdbexe\u3001Docker\u955c\u50cf\u3001\u6e90\u7801\u5305<\/p>\n  <p>\u274c .env\u63d0\u4ea4\u5230Git\/Gitee\/GitHub\u8fdc\u7a0b\u4ed3\u5e93<\/p>\n  <p>\u274c \u751f\u4ea7\u670d\u52a1\u5668.env\u6587\u4ef6\u6743\u9650\u5f00\u653e\u7ed9\u6240\u6709\u7528\u6237<\/p>\n  <p>\u274c \u7ebf\u4e0a\u5bb9\u5668\u955c\u50cf\u5185\u7f6e.env\u914d\u7f6e\u6587\u4ef6<\/p>\n  <h4>\u63a8\u8350\u5b89\u5168\u89c4\u8303<\/h4>\n  <p>\u2705 \u5f00\u53d1\u672c\u5730\u4f7f\u7528.env\uff0c\u751f\u4ea7\u4f7f\u7528\u7cfb\u7edf\/\u5bb9\u5668\u539f\u751f\u73af\u5883\u53d8\u91cf<\/p>\n  <p>\u2705 \u5bc6\u94a5\u7edf\u4e00\u8f6e\u6362\u673a\u5236\uff0c\u4e00\u65e6\u6cc4\u9732\u7acb\u523b\u91cd\u7f6e<\/p>\n  <p>\u2705 \u670d\u52a1\u5668.env\u6743\u9650chmod 600\uff0c\u4ec5\u6240\u6709\u8005\u8bfb\u5199<\/p>\n  <p>\u2705 \u96c6\u7fa4\u73af\u5883\u4f7f\u7528Secret\u52a0\u5bc6\u5b58\u50a8\u654f\u611f\u4fe1\u606f<\/p>\n<\/div>\n<h2 id=\"zh-9\">\u4e5d\u3001\u9ad8\u9891\u8e29\u5751\u4e0e\u89e3\u51b3\u65b9\u6848<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u95ee\u9898\u73b0\u8c61<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u51b3\u65b9\u6848<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>load_dotenv\u8bfb\u4e0d\u5230\u53d8\u91cf<\/td>\n      <td>1.\u6587\u4ef6\u540d\u9519\u8bef 2.\u7b49\u53f7\u4e24\u4fa7\u6709\u7a7a\u683c 3.\u6587\u4ef6\u4e0d\u5728\u9879\u76ee\u6839\u76ee\u5f55<\/td>\n      <td>\u6587\u4ef6\u653e\u6839\u76ee\u5f55\uff0ckey=value\u65e0\u7a7a\u683c\uff0c\u6307\u5b9a\u6587\u4ef6\u8def\u5f84load_dotenv(&#8220;.env.dev&#8221;)<\/td>\n    <\/tr>\n    <tr>\n      <td>\u6570\u5b57\u8bfb\u53d6\u51fa\u6765\u662f\u5b57\u7b26\u4e32<\/td>\n      <td>.env\u6240\u6709\u503c\u9ed8\u8ba4\u5b57\u7b26\u4e32<\/td>\n      <td>int(os.getenv(&#8220;PORT&#8221;, 8000))\u5f3a\u5236\u8f6c\u6362<\/td>\n    <\/tr>\n    <tr>\n      <td>Git\u63d0\u4ea4\u628a.env\u4e0a\u4f20\u4e86<\/td>\n      <td>.gitignore\u672a\u914d\u7f6e\uff0c\u65b0\u7528\u6237\u590d\u5236\u9057\u6f0f<\/td>\n      <td>\u7acb\u5373\u8f6e\u6362\u6240\u6709\u5bc6\u94a5\uff0c\u6e05\u7406git\u5386\u53f2\uff0c\u5b8c\u5584.gitignore\u4e0e\u6a21\u677f<\/td>\n    <\/tr>\n    <tr>\n      <td>Docker\u955c\u50cf\u5185\u7f6e.env\u6cc4\u9732\u5bc6\u94a5<\/td>\n      <td>Dockerfile COPY .env<\/td>\n      <td>\u5220\u9664COPY .env\uff0c\u8fd0\u884c\u65f6&#8211;env-file\u5916\u90e8\u4f20\u5165<\/td>\n    <\/tr>\n    <tr>\n      <td>\u591a\u4eba\u5f00\u53d1\u914d\u7f6e\u51b2\u7a81<\/td>\n      <td>\u5171\u7528.env\uff0c\u672c\u5730\u6570\u636e\u5e93\u4e0d\u540c<\/td>\n      <td>\u6bcf\u4eba\u4f7f\u7528\u72ec\u7acb.env.dev\uff0c\u7edf\u4e00.env.example\u6a21\u677f<\/td>\n    <\/tr>\n    <tr>\n      <td>\u751f\u4ea7.env\u88ab\u5176\u4ed6\u7528\u6237\u8bfb\u53d6<\/td>\n      <td>\u6587\u4ef6\u6743\u9650755\/644<\/td>\n      <td>chmod 600 .env.prod\uff0c\u4ec5\u7ba1\u7406\u5458\u53ef\u8bfb<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"zh-10\">\u5341\u3001\u5168\u6d41\u7a0b\u6807\u51c6\u843d\u5730\u6a21\u677f<\/h2>\n<h3>1. \u9879\u76ee\u76ee\u5f55\u7ed3\u6784<\/h3>\n<pre class=\"code-block\">project\/\n\u251c\u2500\u2500 .gitignore          # \u5c4f\u853d.env\u7cfb\u5217\n\u251c\u2500\u2500 .env.example        # \u6a21\u677f\uff0c\u53ef\u63d0\u4ea4git\n\u251c\u2500\u2500 .env.dev            # \u672c\u5730\u5f00\u53d1\uff08\u4e0d\u4e0a\u4f20\uff09\n\u251c\u2500\u2500 config.py           # \u7edf\u4e00\u8bfb\u53d6\u73af\u5883\u53d8\u91cf\n\u251c\u2500\u2500 pyproject.toml      # \u4f9d\u8d56\u542bpython-dotenv\n\u251c\u2500\u2500 main.py             # \u7a0b\u5e8f\u5165\u53e3\n\u2514\u2500\u2500 Dockerfile          # \u6253\u5305\u4e0d\u590d\u5236.env\n<\/pre>\n<h3>2. .gitignore \u6807\u51c6\u5185\u5bb9<\/h3>\n<pre class=\"code-block\">.env\n.env.*\n!.env.example\n__pycache__\n*.pyc\ndist\nbuild\n<\/pre>\n<h3>3. pyproject.toml \u4f9d\u8d56\u914d\u7f6e<\/h3>\n<pre class=\"code-block\">[project.optional-dependencies]\ndev = [\n  \"python-dotenv>=1.0.0\"\n]\n<\/pre>\n<h3>4. config.py \u901a\u7528\u52a0\u8f7d\u4ee3\u7801<\/h3>\n<pre class=\"code-block\">from dotenv import load_dotenv\nimport os\n\n# \u8bc6\u522b\u73af\u5883\nenv_mode = os.getenv(\"ENV_MODE\", \"dev\")\nenv_path = f\".env.{env_mode}\"\nload_dotenv(env_path)\n\n# \u57fa\u7840\u914d\u7f6e\nDEBUG = os.getenv(\"DEBUG\", \"false\") == \"true\"\nSERVER_PORT = int(os.getenv(\"8000\"))\nDB_HOST = os.getenv(\"DB_HOST\")\nDB_USER = os.getenv(\"DB_USER\")\nDB_PWD = os.getenv(\"DB_PASSWORD\")\n\n# \u5f3a\u5236\u6821\u9a8c\u6838\u5fc3\u5bc6\u94a5\nrequired_vars = [\"DB_HOST\", \"DB_PASSWORD\"]\nfor var in required_vars:\n    if not os.getenv(var):\n        raise RuntimeError(f\"\u73af\u5883\u53d8\u91cf {var} \u672a\u914d\u7f6e\uff0c\u8bf7\u68c0\u67e5 {env_path} \u6587\u4ef6\")\n<\/pre>\n<div class=\"info-box\">\n  <strong>\u5168\u94fe\u8def\u603b\u7ed3\uff1a\u5f00\u53d1\u672c\u5730.env\u9694\u79bb\u5bc6\u94a5\u2192git\u4ec5\u4fdd\u7559\u6a21\u677f\u2192\u6253\u5305\u6392\u9664\u73af\u5883\u6587\u4ef6\u2192\u90e8\u7f72\u65f6\u5916\u90e8\u6ce8\u5165\u73af\u5883\uff0c\u751f\u4ea7\u4f18\u5148\u4f7f\u7528\u96c6\u7fa4Secret\u800c\u975e\u672c\u5730.env\u6587\u4ef6<\/strong>\n<\/div>\n<\/div>\n<!-- \u82f1\u6587\u6559\u7a0b -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>.env File Full Guide (Dev \u2192 Build \u2192 Deploy)<\/h1>\n  <p>What is .env, syntax, python-dotenv, git rules, packaging, Docker\/K8s deployment security<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-1\">1 What is .env File &#038; Core Purpose<\/a><\/li>\n    <li><a href=\"#en-2\">2 .env Syntax &#038; Template Rule<\/a><\/li>\n    <li><a href=\"#en-3\">3 Read .env with python-dotenv<\/a><\/li>\n    <li><a href=\"#en-4\">4 Multi-Env Local Development<\/a><\/li>\n    <li><a href=\"#en-5\">5 Git Best Practices<\/a><\/li>\n    <li><a href=\"#en-6\">6 Packaging Handling<\/a><\/li>\n    <li><a href=\"#en-7\">7 Deployment Workflow: Server\/Docker\/K8s<\/a><\/li>\n    <li><a href=\"#en-8\">8 Production Security Rules<\/a><\/li>\n    <li><a href=\"#en-9\">9 Common Pitfalls &#038; Fixes<\/a><\/li>\n    <li><a href=\"#en-10\">10 Standard Project Template<\/a><\/li>\n  <\/ol>\n<\/div>\n<h2 id=\"en-1\">1 What is .env File &#038; Core Purpose<\/h2>\n<p>.env = environment file, stores environment variables, separates sensitive credentials from source code.<\/p>\n<p>Never hardcode DB password, API key inside your Python scripts.<\/p>\n<h2 id=\"en-2\">2 Syntax &#038; Template .env.example<\/h2>\n<p>Syntax: KEY=VALUE, no space around =, # for comment.<\/p>\n<p>.env.example: commit to git with placeholder values, real .env files ignored by gitignore.<\/p>\n<h2 id=\"en-3\">3 python-dotenv Usage<\/h2>\n<pre class=\"code-block\">pip install python-dotenv\n\nfrom dotenv import load_dotenv\nimport os\nload_dotenv(\".env.dev\")\ndb_pwd = os.getenv(\"DB_PASSWORD\")\n<\/pre>\n<h2 id=\"en-4\">4 Multi Environment Separation<\/h2>\n<ul>\n  <li>.env.dev local dev<\/li>\n  <li>.env.test staging<\/li>\n  <li>.env.prod production<\/li>\n<\/ul>\n<p>Launch command: ENV_MODE=prod python main.py<\/p>\n<h2 id=\"en-5\">5 Git Ignore Rule<\/h2>\n<pre class=\"code-block\"># .gitignore\n.env\n.env.*\n!.env.example\n<\/pre>\n<p>Never push real .env to remote repo, risk credential leak.<\/p>\n<h2 id=\"en-6\">6 Packaging Rules<\/h2>\n<ul>\n  <li>Source dist: .env excluded by default<\/li>\n  <li>PyInstaller: exclude .env from binary<\/li>\n  <li>Docker: Do NOT COPY .env into image<\/li>\n<\/ul>\n<h2 id=\"en-7\">7 Full Deployment Flow<\/h2>\n<h4>Local PC: .env.dev<\/h4>\n<h4>VM Server: .env.prod with chmod 600 permission<\/h4>\n<h4>Docker: pass env via &#8211;env-file at runtime<\/h4>\n<pre class=\"terminal\">docker run --env-file .env.prod app\n<\/pre>\n<h4>K8s: Use Secret for secrets, ConfigMap for plain config (no .env file)<\/h4>\n<h2 id=\"en-8\">8 Production Security Rules<\/h2>\n<ul>\n  <li>No credentials in source code \/ git history<\/li>\n  <li>No .env inside docker images \/ executable packages<\/li>\n  <li>Restrict file permission chmod 600 on server .env<\/li>\n  <li>Rotate keys immediately after credential leak<\/li>\n  <li>Cluster use encrypted Secret instead of local .env file<\/li>\n<\/ul>\n<h2 id=\"en-9\">Common Errors<\/h2>\n<ul>\n  <li>Spaces around KEY=VALUE cause read failure<\/li>\n  <li>All values read as string, cast int\/bool manually<\/li>\n  <li>Accidentally commit .env \u2192 rotate all secrets<\/li>\n<\/ul>\n<h2 id=\"en-10\">Standard Project Structure<\/h2>\n<pre class=\"code-block\">project\/\n\u251c\u2500\u2500 .gitignore\n\u251c\u2500\u2500 .env.example\n\u251c\u2500\u2500 .env.dev\n\u251c\u2500\u2500 config.py\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 main.py\n\u2514\u2500\u2500 Dockerfile\n<\/pre>\n<\/div>\n<\/main>\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/pypi.org\/project\/python-dotenv\/\" target=\"_blank\" rel=\"noopener\">python-dotenv PyPI<\/a>\n    <a href=\"https:\/\/docs.docker.com\/compose\/environment-variables\/\" target=\"_blank\" rel=\"noopener\">Docker Env Guide<\/a>\n    <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/secret\/\" target=\"_blank\" rel=\"noopener\">K8s Secret<\/a>\n  <\/div>\n  <p>.env File Full Dev-Build-Deploy Tutorial<\/p>\n<\/footer>\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(el=>el.classList.remove('active'));\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(btn=>btn.classList.remove('active'));\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang = lang==='zh'?'zh-CN':'en';\n  const prefix = lang==='zh'?'zh':'en';\n  const newHash = window.location.hash.replace(\/^#(zh|en)-\/, prefix+\"-\");\n  if(newHash) window.location.hash = newHash;\n}\nfunction toggleTheme(){\n  const html = document.documentElement;\n  if(html.hasAttribute('data-theme')){\n    html.removeAttribute('data-theme');\n    localStorage.removeItem('theme');\n  }else{\n    html.setAttribute('data-theme','dark');\n    localStorage.setItem('dark');\n  }\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark') document.documentElement.setAttribute('data-theme','dark');\n  const hash = window.location.hash;\n  if(hash){\n    const target = document.querySelector(hash);\n    if(target) setTimeout(()=>target.scrollIntoView({behavior:'smooth'}),100);\n  }\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>.env \u6587\u4ef6\u5168\u6d41\u7a0b\u6559\u7a0b \u00b7 Env File Full Guide \u2699\ufe0f .env \u6587\u4ef6\u5168\u94fe\u8def\u6559\u7a0b \u4e2d\u6587 E [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-329","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions"}],"predecessor-version":[{"id":330,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions\/330"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}