[{"data":1,"prerenderedAt":1323},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fpython-basics":3},{"doc":4,"prev":1283,"next":1290,"resolvedType":8,"readingMinutes":99,"audience":1297,"checklist":1301,"related":1305},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fpython-basics","Python 开发环境","Python 安装、虚拟环境、包管理、常用库与代码片段","article",null,"programming-languages","编程语言","2026-02-27","i-carbon-application",{"type":15,"value":16,"toc":1253},"minimark",[17,21,25,29,50,53,65,68,109,165,168,243,246,250,311,315,318,413,417,499,502,506,599,602,721,725,851,854,1027,1030,1124,1127,1130,1133,1148,1152,1162,1166,1176,1179,1186,1189,1193,1203,1207,1210,1249],[18,19,6],"h1",{"id":20},"python-开发环境",[22,23,24],"p",{},"这页更偏“Python 入门与常用工具总览”。如果你是第一次把 Python 用起来，优先搞清楚虚拟环境、依赖安装和常用库，不需要一开始就追求很复杂的工程化。",[26,27,28],"h2",{"id":28},"推荐学习顺序",[30,31,32,36,39,42],"ol",{},[33,34,35],"li",{},"先装 Python",[33,37,38],{},"会创建和切换虚拟环境",[33,40,41],{},"学会安装依赖与导出依赖",[33,43,44,45,49],{},"再接触 ",[46,47,48],"code",{},"uv","、Poetry 这类更现代的工作流",[26,51,52],{"id":52},"这页适合谁",[54,55,56,59,62],"ul",{},[33,57,58],{},"想开始写 Python 脚本",[33,60,61],{},"需要处理 API、文件、JSON、自动化任务",[33,63,64],{},"想先有一套能跑的环境，再慢慢升级工作流",[26,66,67],{"id":67},"安装",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-powershell shiki shiki-themes github-light github-dark","# Windows\nwinget install Python.Python.3.12\n# 或\nscoop install python\n","powershell","",[46,76,77,86,97,103],{"__ignoreMap":74},[78,79,82],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"sJ8bj","# Windows\n",[78,87,89,93],{"class":80,"line":88},2,[78,90,92],{"class":91},"sVt8B","winget install Python.Python.",[78,94,96],{"class":95},"sj4cs","3.12\n",[78,98,100],{"class":80,"line":99},3,[78,101,102],{"class":84},"# 或\n",[78,104,106],{"class":80,"line":105},4,[78,107,108],{"class":91},"scoop install python\n",[69,110,114],{"className":111,"code":112,"language":113,"meta":74,"style":74},"language-bash shiki shiki-themes github-light github-dark","# macOS\nbrew install python\n\n# Ubuntu\napt install python3 python3-pip python3-venv -y\n","bash",[46,115,116,121,134,140,145],{"__ignoreMap":74},[78,117,118],{"class":80,"line":81},[78,119,120],{"class":84},"# macOS\n",[78,122,123,127,131],{"class":80,"line":88},[78,124,126],{"class":125},"sScJk","brew",[78,128,130],{"class":129},"sZZnC"," install",[78,132,133],{"class":129}," python\n",[78,135,136],{"class":80,"line":99},[78,137,139],{"emptyLinePlaceholder":138},true,"\n",[78,141,142],{"class":80,"line":105},[78,143,144],{"class":84},"# Ubuntu\n",[78,146,148,151,153,156,159,162],{"class":80,"line":147},5,[78,149,150],{"class":125},"apt",[78,152,130],{"class":129},[78,154,155],{"class":129}," python3",[78,157,158],{"class":129}," python3-pip",[78,160,161],{"class":129}," python3-venv",[78,163,164],{"class":95}," -y\n",[26,166,167],{"id":167},"虚拟环境",[69,169,171],{"className":111,"code":170,"language":113,"meta":74,"style":74},"# 创建\npython -m venv .venv\n\n# 激活\n# Linux\u002FmacOS\nsource .venv\u002Fbin\u002Factivate\n# Windows\n.venv\\Scripts\\activate\n\n# 退出\ndeactivate\n",[46,172,173,178,192,196,201,206,215,220,226,231,237],{"__ignoreMap":74},[78,174,175],{"class":80,"line":81},[78,176,177],{"class":84},"# 创建\n",[78,179,180,183,186,189],{"class":80,"line":88},[78,181,182],{"class":125},"python",[78,184,185],{"class":95}," -m",[78,187,188],{"class":129}," venv",[78,190,191],{"class":129}," .venv\n",[78,193,194],{"class":80,"line":99},[78,195,139],{"emptyLinePlaceholder":138},[78,197,198],{"class":80,"line":105},[78,199,200],{"class":84},"# 激活\n",[78,202,203],{"class":80,"line":147},[78,204,205],{"class":84},"# Linux\u002FmacOS\n",[78,207,209,212],{"class":80,"line":208},6,[78,210,211],{"class":95},"source",[78,213,214],{"class":129}," .venv\u002Fbin\u002Factivate\n",[78,216,218],{"class":80,"line":217},7,[78,219,85],{"class":84},[78,221,223],{"class":80,"line":222},8,[78,224,225],{"class":125},".venv\\Scripts\\activate\n",[78,227,229],{"class":80,"line":228},9,[78,230,139],{"emptyLinePlaceholder":138},[78,232,234],{"class":80,"line":233},10,[78,235,236],{"class":84},"# 退出\n",[78,238,240],{"class":80,"line":239},11,[78,241,242],{"class":125},"deactivate\n",[26,244,245],{"id":245},"包管理",[247,248,249],"h3",{"id":249},"pip",[69,251,253],{"className":111,"code":252,"language":113,"meta":74,"style":74},"pip install requests\npip install -r requirements.txt\npip freeze > requirements.txt\npip list --outdated\npip install --upgrade package\n",[46,254,255,264,276,289,299],{"__ignoreMap":74},[78,256,257,259,261],{"class":80,"line":81},[78,258,249],{"class":125},[78,260,130],{"class":129},[78,262,263],{"class":129}," requests\n",[78,265,266,268,270,273],{"class":80,"line":88},[78,267,249],{"class":125},[78,269,130],{"class":129},[78,271,272],{"class":95}," -r",[78,274,275],{"class":129}," requirements.txt\n",[78,277,278,280,283,287],{"class":80,"line":99},[78,279,249],{"class":125},[78,281,282],{"class":129}," freeze",[78,284,286],{"class":285},"szBVR"," >",[78,288,275],{"class":129},[78,290,291,293,296],{"class":80,"line":105},[78,292,249],{"class":125},[78,294,295],{"class":129}," list",[78,297,298],{"class":95}," --outdated\n",[78,300,301,303,305,308],{"class":80,"line":147},[78,302,249],{"class":125},[78,304,130],{"class":129},[78,306,307],{"class":95}," --upgrade",[78,309,310],{"class":129}," package\n",[247,312,314],{"id":313},"uv推荐","uv（推荐）",[22,316,317],{},"更快的 Python 包管理器。",[69,319,321],{"className":111,"code":320,"language":113,"meta":74,"style":74},"# 安装\nscoop install uv\n# 或\npip install uv\n\n# 使用\nuv venv                    # 创建虚拟环境\nuv pip install requests    # 安装包\nuv pip compile requirements.in -o requirements.txt\nuv run script.py           # 直接运行\n",[46,322,323,328,338,342,350,354,359,368,383,400],{"__ignoreMap":74},[78,324,325],{"class":80,"line":81},[78,326,327],{"class":84},"# 安装\n",[78,329,330,333,335],{"class":80,"line":88},[78,331,332],{"class":125},"scoop",[78,334,130],{"class":129},[78,336,337],{"class":129}," uv\n",[78,339,340],{"class":80,"line":99},[78,341,102],{"class":84},[78,343,344,346,348],{"class":80,"line":105},[78,345,249],{"class":125},[78,347,130],{"class":129},[78,349,337],{"class":129},[78,351,352],{"class":80,"line":147},[78,353,139],{"emptyLinePlaceholder":138},[78,355,356],{"class":80,"line":208},[78,357,358],{"class":84},"# 使用\n",[78,360,361,363,365],{"class":80,"line":217},[78,362,48],{"class":125},[78,364,188],{"class":129},[78,366,367],{"class":84},"                    # 创建虚拟环境\n",[78,369,370,372,375,377,380],{"class":80,"line":222},[78,371,48],{"class":125},[78,373,374],{"class":129}," pip",[78,376,130],{"class":129},[78,378,379],{"class":129}," requests",[78,381,382],{"class":84},"    # 安装包\n",[78,384,385,387,389,392,395,398],{"class":80,"line":228},[78,386,48],{"class":125},[78,388,374],{"class":129},[78,390,391],{"class":129}," compile",[78,393,394],{"class":129}," requirements.in",[78,396,397],{"class":95}," -o",[78,399,275],{"class":129},[78,401,402,404,407,410],{"class":80,"line":233},[78,403,48],{"class":125},[78,405,406],{"class":129}," run",[78,408,409],{"class":129}," script.py",[78,411,412],{"class":84},"           # 直接运行\n",[247,414,416],{"id":415},"poetry","Poetry",[69,418,420],{"className":111,"code":419,"language":113,"meta":74,"style":74},"pip install poetry\n\npoetry new myproject       # 新建项目\npoetry init                # 在已有项目初始化\npoetry add requests        # 添加依赖\npoetry install             # 安装所有依赖\npoetry shell               # 进入虚拟环境\npoetry build               # 构建包\n",[46,421,422,431,435,448,458,470,479,489],{"__ignoreMap":74},[78,423,424,426,428],{"class":80,"line":81},[78,425,249],{"class":125},[78,427,130],{"class":129},[78,429,430],{"class":129}," poetry\n",[78,432,433],{"class":80,"line":88},[78,434,139],{"emptyLinePlaceholder":138},[78,436,437,439,442,445],{"class":80,"line":99},[78,438,415],{"class":125},[78,440,441],{"class":129}," new",[78,443,444],{"class":129}," myproject",[78,446,447],{"class":84},"       # 新建项目\n",[78,449,450,452,455],{"class":80,"line":105},[78,451,415],{"class":125},[78,453,454],{"class":129}," init",[78,456,457],{"class":84},"                # 在已有项目初始化\n",[78,459,460,462,465,467],{"class":80,"line":147},[78,461,415],{"class":125},[78,463,464],{"class":129}," add",[78,466,379],{"class":129},[78,468,469],{"class":84},"        # 添加依赖\n",[78,471,472,474,476],{"class":80,"line":208},[78,473,415],{"class":125},[78,475,130],{"class":129},[78,477,478],{"class":84},"             # 安装所有依赖\n",[78,480,481,483,486],{"class":80,"line":217},[78,482,415],{"class":125},[78,484,485],{"class":129}," shell",[78,487,488],{"class":84},"               # 进入虚拟环境\n",[78,490,491,493,496],{"class":80,"line":222},[78,492,415],{"class":125},[78,494,495],{"class":129}," build",[78,497,498],{"class":84},"               # 构建包\n",[26,500,501],{"id":501},"常用代码片段",[247,503,505],{"id":504},"http-请求","HTTP 请求",[69,507,510],{"className":508,"code":509,"language":182,"meta":74,"style":74},"language-python shiki shiki-themes github-light github-dark","import requests\n\n# GET\nresp = requests.get(\"https:\u002F\u002Fapi.example.com\u002Fdata\")\ndata = resp.json()\n\n# POST\nresp = requests.post(\"https:\u002F\u002Fapi.example.com\u002Fdata\", json={\"key\": \"value\"})\n",[46,511,512,519,523,528,545,555,559,564],{"__ignoreMap":74},[78,513,514,517],{"class":80,"line":81},[78,515,516],{"class":285},"import",[78,518,263],{"class":91},[78,520,521],{"class":80,"line":88},[78,522,139],{"emptyLinePlaceholder":138},[78,524,525],{"class":80,"line":99},[78,526,527],{"class":84},"# GET\n",[78,529,530,533,536,539,542],{"class":80,"line":105},[78,531,532],{"class":91},"resp ",[78,534,535],{"class":285},"=",[78,537,538],{"class":91}," requests.get(",[78,540,541],{"class":129},"\"https:\u002F\u002Fapi.example.com\u002Fdata\"",[78,543,544],{"class":91},")\n",[78,546,547,550,552],{"class":80,"line":147},[78,548,549],{"class":91},"data ",[78,551,535],{"class":285},[78,553,554],{"class":91}," resp.json()\n",[78,556,557],{"class":80,"line":208},[78,558,139],{"emptyLinePlaceholder":138},[78,560,561],{"class":80,"line":217},[78,562,563],{"class":84},"# POST\n",[78,565,566,568,570,573,575,578,582,584,587,590,593,596],{"class":80,"line":222},[78,567,532],{"class":91},[78,569,535],{"class":285},[78,571,572],{"class":91}," requests.post(",[78,574,541],{"class":129},[78,576,577],{"class":91},", ",[78,579,581],{"class":580},"s4XuR","json",[78,583,535],{"class":285},[78,585,586],{"class":91},"{",[78,588,589],{"class":129},"\"key\"",[78,591,592],{"class":91},": ",[78,594,595],{"class":129},"\"value\"",[78,597,598],{"class":91},"})\n",[247,600,601],{"id":601},"文件操作",[69,603,605],{"className":508,"code":604,"language":182,"meta":74,"style":74},"from pathlib import Path\n\n# 读写文件\ncontent = Path(\"file.txt\").read_text(encoding=\"utf-8\")\nPath(\"output.txt\").write_text(\"hello\", encoding=\"utf-8\")\n\n# 遍历目录\nfor f in Path(\".\").rglob(\"*.py\"):\n    print(f)\n",[46,606,607,620,624,629,655,679,683,688,713],{"__ignoreMap":74},[78,608,609,612,615,617],{"class":80,"line":81},[78,610,611],{"class":285},"from",[78,613,614],{"class":91}," pathlib ",[78,616,516],{"class":285},[78,618,619],{"class":91}," Path\n",[78,621,622],{"class":80,"line":88},[78,623,139],{"emptyLinePlaceholder":138},[78,625,626],{"class":80,"line":99},[78,627,628],{"class":84},"# 读写文件\n",[78,630,631,634,636,639,642,645,648,650,653],{"class":80,"line":105},[78,632,633],{"class":91},"content ",[78,635,535],{"class":285},[78,637,638],{"class":91}," Path(",[78,640,641],{"class":129},"\"file.txt\"",[78,643,644],{"class":91},").read_text(",[78,646,647],{"class":580},"encoding",[78,649,535],{"class":285},[78,651,652],{"class":129},"\"utf-8\"",[78,654,544],{"class":91},[78,656,657,660,663,666,669,671,673,675,677],{"class":80,"line":147},[78,658,659],{"class":91},"Path(",[78,661,662],{"class":129},"\"output.txt\"",[78,664,665],{"class":91},").write_text(",[78,667,668],{"class":129},"\"hello\"",[78,670,577],{"class":91},[78,672,647],{"class":580},[78,674,535],{"class":285},[78,676,652],{"class":129},[78,678,544],{"class":91},[78,680,681],{"class":80,"line":208},[78,682,139],{"emptyLinePlaceholder":138},[78,684,685],{"class":80,"line":217},[78,686,687],{"class":84},"# 遍历目录\n",[78,689,690,693,696,699,701,704,707,710],{"class":80,"line":222},[78,691,692],{"class":285},"for",[78,694,695],{"class":91}," f ",[78,697,698],{"class":285},"in",[78,700,638],{"class":91},[78,702,703],{"class":129},"\".\"",[78,705,706],{"class":91},").rglob(",[78,708,709],{"class":129},"\"*.py\"",[78,711,712],{"class":91},"):\n",[78,714,715,718],{"class":80,"line":228},[78,716,717],{"class":95},"    print",[78,719,720],{"class":91},"(f)\n",[247,722,724],{"id":723},"json-处理","JSON 处理",[69,726,728],{"className":508,"code":727,"language":182,"meta":74,"style":74},"import json\n\n# 读取\nwith open(\"data.json\", encoding=\"utf-8\") as f:\n    data = json.load(f)\n\n# 写入\nwith open(\"out.json\", \"w\", encoding=\"utf-8\") as f:\n    json.dump(data, f, ensure_ascii=False, indent=2)\n",[46,729,730,737,741,746,777,787,791,796,826],{"__ignoreMap":74},[78,731,732,734],{"class":80,"line":81},[78,733,516],{"class":285},[78,735,736],{"class":91}," json\n",[78,738,739],{"class":80,"line":88},[78,740,139],{"emptyLinePlaceholder":138},[78,742,743],{"class":80,"line":99},[78,744,745],{"class":84},"# 读取\n",[78,747,748,751,754,757,760,762,764,766,768,771,774],{"class":80,"line":105},[78,749,750],{"class":285},"with",[78,752,753],{"class":95}," open",[78,755,756],{"class":91},"(",[78,758,759],{"class":129},"\"data.json\"",[78,761,577],{"class":91},[78,763,647],{"class":580},[78,765,535],{"class":285},[78,767,652],{"class":129},[78,769,770],{"class":91},") ",[78,772,773],{"class":285},"as",[78,775,776],{"class":91}," f:\n",[78,778,779,782,784],{"class":80,"line":147},[78,780,781],{"class":91},"    data ",[78,783,535],{"class":285},[78,785,786],{"class":91}," json.load(f)\n",[78,788,789],{"class":80,"line":208},[78,790,139],{"emptyLinePlaceholder":138},[78,792,793],{"class":80,"line":217},[78,794,795],{"class":84},"# 写入\n",[78,797,798,800,802,804,807,809,812,814,816,818,820,822,824],{"class":80,"line":222},[78,799,750],{"class":285},[78,801,753],{"class":95},[78,803,756],{"class":91},[78,805,806],{"class":129},"\"out.json\"",[78,808,577],{"class":91},[78,810,811],{"class":129},"\"w\"",[78,813,577],{"class":91},[78,815,647],{"class":580},[78,817,535],{"class":285},[78,819,652],{"class":129},[78,821,770],{"class":91},[78,823,773],{"class":285},[78,825,776],{"class":91},[78,827,828,831,834,836,839,841,844,846,849],{"class":80,"line":228},[78,829,830],{"class":91},"    json.dump(data, f, ",[78,832,833],{"class":580},"ensure_ascii",[78,835,535],{"class":285},[78,837,838],{"class":95},"False",[78,840,577],{"class":91},[78,842,843],{"class":580},"indent",[78,845,535],{"class":285},[78,847,848],{"class":95},"2",[78,850,544],{"class":91},[247,852,853],{"id":853},"异步编程",[69,855,857],{"className":508,"code":856,"language":182,"meta":74,"style":74},"import asyncio\nimport aiohttp\n\nasync def fetch(url):\n    async with aiohttp.ClientSession() as session:\n        async with session.get(url) as resp:\n            return await resp.json()\n\nasync def main():\n    urls = [\"https:\u002F\u002Fapi.example.com\u002F1\", \"https:\u002F\u002Fapi.example.com\u002F2\"]\n    tasks = [fetch(url) for url in urls]\n    results = await asyncio.gather(*tasks)\n    print(results)\n\nasyncio.run(main())\n",[46,858,859,866,873,877,891,907,922,932,936,948,969,989,1008,1016,1021],{"__ignoreMap":74},[78,860,861,863],{"class":80,"line":81},[78,862,516],{"class":285},[78,864,865],{"class":91}," asyncio\n",[78,867,868,870],{"class":80,"line":88},[78,869,516],{"class":285},[78,871,872],{"class":91}," aiohttp\n",[78,874,875],{"class":80,"line":99},[78,876,139],{"emptyLinePlaceholder":138},[78,878,879,882,885,888],{"class":80,"line":105},[78,880,881],{"class":285},"async",[78,883,884],{"class":285}," def",[78,886,887],{"class":125}," fetch",[78,889,890],{"class":91},"(url):\n",[78,892,893,896,899,902,904],{"class":80,"line":147},[78,894,895],{"class":285},"    async",[78,897,898],{"class":285}," with",[78,900,901],{"class":91}," aiohttp.ClientSession() ",[78,903,773],{"class":285},[78,905,906],{"class":91}," session:\n",[78,908,909,912,914,917,919],{"class":80,"line":208},[78,910,911],{"class":285},"        async",[78,913,898],{"class":285},[78,915,916],{"class":91}," session.get(url) ",[78,918,773],{"class":285},[78,920,921],{"class":91}," resp:\n",[78,923,924,927,930],{"class":80,"line":217},[78,925,926],{"class":285},"            return",[78,928,929],{"class":285}," await",[78,931,554],{"class":91},[78,933,934],{"class":80,"line":222},[78,935,139],{"emptyLinePlaceholder":138},[78,937,938,940,942,945],{"class":80,"line":228},[78,939,881],{"class":285},[78,941,884],{"class":285},[78,943,944],{"class":125}," main",[78,946,947],{"class":91},"():\n",[78,949,950,953,955,958,961,963,966],{"class":80,"line":233},[78,951,952],{"class":91},"    urls ",[78,954,535],{"class":285},[78,956,957],{"class":91}," [",[78,959,960],{"class":129},"\"https:\u002F\u002Fapi.example.com\u002F1\"",[78,962,577],{"class":91},[78,964,965],{"class":129},"\"https:\u002F\u002Fapi.example.com\u002F2\"",[78,967,968],{"class":91},"]\n",[78,970,971,974,976,979,981,984,986],{"class":80,"line":239},[78,972,973],{"class":91},"    tasks ",[78,975,535],{"class":285},[78,977,978],{"class":91}," [fetch(url) ",[78,980,692],{"class":285},[78,982,983],{"class":91}," url ",[78,985,698],{"class":285},[78,987,988],{"class":91}," urls]\n",[78,990,992,995,997,999,1002,1005],{"class":80,"line":991},12,[78,993,994],{"class":91},"    results ",[78,996,535],{"class":285},[78,998,929],{"class":285},[78,1000,1001],{"class":91}," asyncio.gather(",[78,1003,1004],{"class":285},"*",[78,1006,1007],{"class":91},"tasks)\n",[78,1009,1011,1013],{"class":80,"line":1010},13,[78,1012,717],{"class":95},[78,1014,1015],{"class":91},"(results)\n",[78,1017,1019],{"class":80,"line":1018},14,[78,1020,139],{"emptyLinePlaceholder":138},[78,1022,1024],{"class":80,"line":1023},15,[78,1025,1026],{"class":91},"asyncio.run(main())\n",[26,1028,1029],{"id":1029},"常用库",[1031,1032,1033,1046],"table",{},[1034,1035,1036],"thead",{},[1037,1038,1039,1043],"tr",{},[1040,1041,1042],"th",{},"库",[1040,1044,1045],{},"说明",[1047,1048,1049,1064,1076,1088,1100,1112],"tbody",{},[1037,1050,1051,1061],{},[1052,1053,1054],"td",{},[1055,1056,1060],"a",{"href":1057,"rel":1058},"https:\u002F\u002Fdocs.python-requests.org\u002F",[1059],"nofollow","requests",[1052,1062,1063],{},"HTTP 客户端",[1037,1065,1066,1073],{},[1052,1067,1068],{},[1055,1069,1072],{"href":1070,"rel":1071},"https:\u002F\u002Ffastapi.tiangolo.com\u002F",[1059],"FastAPI",[1052,1074,1075],{},"现代 Web 框架",[1037,1077,1078,1085],{},[1052,1079,1080],{},[1055,1081,1084],{"href":1082,"rel":1083},"https:\u002F\u002Fdocs.pydantic.dev\u002F",[1059],"Pydantic",[1052,1086,1087],{},"数据验证",[1037,1089,1090,1097],{},[1052,1091,1092],{},[1055,1093,1096],{"href":1094,"rel":1095},"https:\u002F\u002Fgithub.com\u002FTextualize\u002Frich",[1059],"Rich",[1052,1098,1099],{},"终端美化输出",[1037,1101,1102,1109],{},[1052,1103,1104],{},[1055,1105,1108],{"href":1106,"rel":1107},"https:\u002F\u002Fclick.palletsprojects.com\u002F",[1059],"Click",[1052,1110,1111],{},"CLI 框架",[1037,1113,1114,1121],{},[1052,1115,1116],{},[1055,1117,1120],{"href":1118,"rel":1119},"https:\u002F\u002Fpillow.readthedocs.io\u002F",[1059],"Pillow",[1052,1122,1123],{},"图像处理",[26,1125,1126],{"id":1126},"参考链接",[26,1128,1129],{"id":1129},"常见使用场景",[247,1131,1132],{"id":1132},"写自动化脚本",[54,1134,1135,1139,1144],{},[33,1136,1137],{},[46,1138,1060],{},[33,1140,1141],{},[46,1142,1143],{},"pathlib",[33,1145,1146],{},[46,1147,581],{},[247,1149,1151],{"id":1150},"写-api-服务","写 API 服务",[54,1153,1154,1158],{},[33,1155,1156],{},[46,1157,1072],{},[33,1159,1160],{},[46,1161,1084],{},[247,1163,1165],{"id":1164},"做-cli-工具","做 CLI 工具",[54,1167,1168,1172],{},[33,1169,1170],{},[46,1171,1108],{},[33,1173,1174],{},[46,1175,1096],{},[26,1177,1178],{"id":1178},"常见问题",[247,1180,1182,1183],{"id":1181},"已经装了包代码里还是-modulenotfounderror","已经装了包，代码里还是 ",[46,1184,1185],{},"ModuleNotFoundError",[22,1187,1188],{},"大多数时候是包装到了错误的解释器或错误的虚拟环境里。先确认当前终端和编辑器用的是同一个环境。",[247,1190,1192],{"id":1191},"该选-uv-还是-poetry","该选 uv 还是 Poetry",[54,1194,1195,1200],{},[33,1196,1197,1198],{},"先求快和轻：",[46,1199,48],{},[33,1201,1202],{},"做包管理、发布和完整项目元数据：Poetry",[247,1204,1206],{"id":1205},"requirementstxt-还要不要保留","requirements.txt 还要不要保留",[22,1208,1209],{},"老项目通常要保留；新项目可以视团队习惯选择更现代的依赖描述方式。",[54,1211,1212,1220,1228,1235,1242],{},[33,1213,1214,1219],{},[1055,1215,1218],{"href":1216,"rel":1217},"https:\u002F\u002Fwww.python.org\u002F",[1059],"Python 官网"," — 文档与下载",[33,1221,1222,1227],{},[1055,1223,1226],{"href":1224,"rel":1225},"https:\u002F\u002Frealpython.com\u002F",[1059],"Real Python"," — 教程",[33,1229,1230,1234],{},[1055,1231,48],{"href":1232,"rel":1233},"https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv",[1059]," — 快速包管理",[33,1236,1237,1241],{},[1055,1238,416],{"href":1239,"rel":1240},"https:\u002F\u002Fpython-poetry.org\u002F",[1059]," — 项目管理",[33,1243,1244,1248],{},[1055,1245,1247],{"href":1246},"\u002Fdocs\u002Fpython-setup","Python 环境配置"," — 更完整的安装、镜像和编辑器配置流程",[1250,1251,1252],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":74,"searchDepth":88,"depth":88,"links":1254},[1255,1256,1257,1258,1259,1264,1270,1271,1272,1277],{"id":28,"depth":88,"text":28},{"id":52,"depth":88,"text":52},{"id":67,"depth":88,"text":67},{"id":167,"depth":88,"text":167},{"id":245,"depth":88,"text":245,"children":1260},[1261,1262,1263],{"id":249,"depth":99,"text":249},{"id":313,"depth":99,"text":314},{"id":415,"depth":99,"text":416},{"id":501,"depth":88,"text":501,"children":1265},[1266,1267,1268,1269],{"id":504,"depth":99,"text":505},{"id":601,"depth":99,"text":601},{"id":723,"depth":99,"text":724},{"id":853,"depth":99,"text":853},{"id":1029,"depth":88,"text":1029},{"id":1126,"depth":88,"text":1126},{"id":1129,"depth":88,"text":1129,"children":1273},[1274,1275,1276],{"id":1132,"depth":99,"text":1132},{"id":1150,"depth":99,"text":1151},{"id":1164,"depth":99,"text":1165},{"id":1178,"depth":88,"text":1178,"children":1278},[1279,1281,1282],{"id":1181,"depth":99,"text":1280},"已经装了包，代码里还是 ModuleNotFoundError",{"id":1191,"depth":99,"text":1192},{"id":1205,"depth":99,"text":1206},{"path":1284,"title":1285,"description":1286,"docType":8,"resourceKind":9,"categoryId":1287,"categoryLabel":1288,"updatedAt":12,"publishedAt":12,"icon":1289},"\u002Fdocs\u002Fpowershell-tips","PowerShell 实用技巧","PowerShell 常用命令、脚本编写、文件操作、系统管理与自动化","dev-environment","开发环境","i-carbon-code",{"path":1291,"title":1292,"description":1293,"docType":8,"resourceKind":9,"categoryId":1294,"categoryLabel":1295,"updatedAt":12,"publishedAt":12,"icon":1296},"\u002Fdocs\u002Fqbittorrent-setup","qBittorrent 配置指南","qBittorrent 安装、Tracker 配置、RSS 订阅与进阶设置","entertainment-resources","娱乐与资源","i-carbon-game-console",[1298,1299,1300],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1302,1303,1304],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1306,1311,1315,1319],{"path":1307,"title":1308,"description":1309,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1310,"publishedAt":1310,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践","2026-02-28",{"path":1312,"title":1313,"description":1314,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1310,"publishedAt":1310,"icon":13},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令",{"path":1316,"title":1317,"description":1318,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1310,"publishedAt":1310,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1320,"title":1321,"description":1322,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1310,"publishedAt":1310,"icon":13},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",1776215713978]