最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零打造一個(gè)Python圖形化exe編譯工具的踩坑實(shí)錄與完整解析

 更新時(shí)間:2026年04月20日 08:25:06   作者:winfredzhang  
把?Python?腳本編譯成?EXE?可執(zhí)行文件,是很多?Python?開(kāi)發(fā)者的剛需,本文介紹了一個(gè)將Python腳本編譯為EXE文件的圖形化工具的設(shè)計(jì)與實(shí)現(xiàn),希望對(duì)大家有所幫助

前言

把 Python 腳本編譯成 EXE 可執(zhí)行文件,是很多 Python 開(kāi)發(fā)者的剛需。雖然 PyInstaller 本身已經(jīng)足夠強(qiáng)大,但每次打包都要手動(dòng)敲一長(zhǎng)串命令行,手動(dòng)確認(rèn)依賴(lài)庫(kù)有沒(méi)有裝全,手動(dòng)創(chuàng)建虛擬環(huán)境來(lái)減小體積——這個(gè)流程繁瑣、易錯(cuò)、難以復(fù)用。

于是我萌生了一個(gè)想法:能不能寫(xiě)一個(gè)圖形化的工具,選一個(gè) .py 文件,自動(dòng)掃描它用了哪些第三方庫(kù),一鍵就編譯成 EXE?

這篇文章記錄了這個(gè)工具從設(shè)計(jì)到實(shí)現(xiàn)、再到"用自己編譯自己"過(guò)程中遇到的所有問(wèn)題與解決方案。如果你正在做類(lèi)似的事情,或者你對(duì) PyInstaller 的打包機(jī)制、Python AST 解析、wxPython GUI 開(kāi)發(fā)感興趣,這篇文章應(yīng)該能幫到你。

一、整體架構(gòu)設(shè)計(jì)

這個(gè)工具的工作流程可以拆解為四個(gè)步驟:

選擇 .py 文件 → 自動(dòng)掃描依賴(lài) → 創(chuàng)建虛擬環(huán)境并安裝依賴(lài) → 調(diào)用 PyInstaller 編譯

對(duì)應(yīng)到代碼中,核心模塊有三個(gè):

依賴(lài)掃描引擎負(fù)責(zé)解析 Python 源文件的 AST(抽象語(yǔ)法樹(shù)),提取所有 import 語(yǔ)句,然后過(guò)濾掉標(biāo)準(zhǔn)庫(kù)模塊,識(shí)別出真正需要 pip 安裝的第三方庫(kù)。編譯執(zhí)行引擎負(fù)責(zé)在子線(xiàn)程中依次執(zhí)行創(chuàng)建虛擬環(huán)境、安裝依賴(lài)、調(diào)用 PyInstaller 這三個(gè)步驟,并將命令行輸出實(shí)時(shí)回傳到界面。wxPython 圖形界面把上述功能用直觀(guān)的四步式界面呈現(xiàn)出來(lái)。

二、依賴(lài)掃描:用 AST 而不是正則表達(dá)式

掃描一個(gè) Python 文件用了哪些庫(kù),最容易想到的方案是用正則表達(dá)式匹配 import xxxfrom xxx import yyy。但這種方案有明顯缺陷:它無(wú)法處理多行 import、條件 import、注釋中的 import、字符串中的 import 等情況。

更可靠的方案是使用 Python 標(biāo)準(zhǔn)庫(kù)中的 ast 模塊。ast.parse() 能將源代碼解析為抽象語(yǔ)法樹(shù),然后用 ast.walk() 遍歷所有節(jié)點(diǎn),精確匹配 ast.Importast.ImportFrom 兩種節(jié)點(diǎn)類(lèi)型:

def scan_imports(filepath):
    with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
        source = f.read()
    try:
        tree = ast.parse(source)
    except SyntaxError:
        return set()

    imports = set()
    for node in ast.walk(tree):
        if isinstance(node, ast.Import):
            for alias in node.names:
                top = alias.name.split(".")[0]
                imports.add(top)
        elif isinstance(node, ast.ImportFrom):
            if node.module:
                top = node.module.split(".")[0]
                imports.add(top)
    return imports

這里有一個(gè)關(guān)鍵細(xì)節(jié):alias.name.split(".")[0]。因?yàn)橄?import os.path 這樣的語(yǔ)句,我們只需要提取頂級(jí)模塊名 os,因?yàn)?pip 安裝的粒度是包(package),不是子模塊。

區(qū)分標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)

掃描出來(lái)的模塊名中,os、sys、json 這些標(biāo)準(zhǔn)庫(kù)模塊是不需要 pip 安裝的,必須過(guò)濾掉。程序內(nèi)置了一份涵蓋 Python 3.6 到 3.12 的標(biāo)準(zhǔn)庫(kù)模塊名集合,同時(shí)利用 Python 3.10+ 提供的 sys.stdlib_module_names 屬性做補(bǔ)充:

def filter_third_party(imports):
    stdlib = set(STDLIB_MODULES)
    if hasattr(sys, "stdlib_module_names"):
        stdlib = stdlib | sys.stdlib_module_names
    third_party = set()
    for mod in imports:
        if mod not in stdlib and not mod.startswith("_"):
            third_party.add(mod)
    return third_party

import 名和 pip 包名的映射

Python 生態(tài)中有一個(gè)令人頭疼的現(xiàn)象:很多庫(kù)的 import 名和 pip 包名不一致。比如你寫(xiě) import wx,但安裝的時(shí)候是 pip install wxPython;寫(xiě) import PIL,裝的是 pip install Pillow;寫(xiě) import cv2,裝的是 pip install opencv-python。

程序內(nèi)置了一個(gè)映射字典來(lái)處理這種情況:

IMPORT_TO_PIP = {
    "wx": "wxPython",
    "cv2": "opencv-python",
    "PIL": "Pillow",
    "sklearn": "scikit-learn",
    "yaml": "PyYAML",
    "bs4": "beautifulsoup4",
    "dateutil": "python-dateutil",
    "docx": "python-docx",
    # ... 更多映射
}

當(dāng)然,這個(gè)字典不可能覆蓋所有情況,所以界面上還提供了"手動(dòng)添加庫(kù)"的功能作為補(bǔ)充。

三、虛擬環(huán)境策略:為什么編譯出的 EXE 那么大?

很多人第一次用 PyInstaller 打包時(shí)都會(huì)震驚:一個(gè)簡(jiǎn)單的 Hello World 腳本,編譯出來(lái)的 EXE 居然有幾十 MB。這是因?yàn)?PyInstaller 會(huì)把當(dāng)前 Python 環(huán)境中所有已安裝的包都掃描一遍,很多無(wú)關(guān)的庫(kù)會(huì)被錯(cuò)誤地打包進(jìn)去。

解決方案是使用干凈的虛擬環(huán)境。程序在編譯前會(huì)自動(dòng)創(chuàng)建一個(gè)臨時(shí)虛擬環(huán)境,只安裝目標(biāo)腳本真正需要的庫(kù)加上 PyInstaller 本身,這樣編譯出的 EXE 體積可以顯著縮小。

# 創(chuàng)建虛擬環(huán)境
self._run_cmd(f'"{python_exe}" -m venv "{venv_dir}"')

# 只安裝必要的庫(kù)
self._run_cmd(f'"{venv_pip}" install pyinstaller {libs}')

# 用虛擬環(huán)境中的 pyinstaller 打包
self._run_cmd(f'"{pyinstaller_cmd}" --onefile --windowed "{py_file}"')

編譯完成后,程序會(huì)詢(xún)問(wèn)用戶(hù)是否刪除虛擬環(huán)境以釋放磁盤(pán)空間。這個(gè)流程完全自動(dòng)化,用戶(hù)不需要手動(dòng)執(zhí)行任何命令行操作。

四、子線(xiàn)程執(zhí)行與實(shí)時(shí)日志

編譯過(guò)程通常需要幾十秒甚至幾分鐘,如果在主線(xiàn)程中執(zhí)行,整個(gè)界面就會(huì)卡死。因此編譯邏輯放在子線(xiàn)程中運(yùn)行:

def on_build(self, event):
    self.is_running = True
    self.btn_build.Disable()
    thread = threading.Thread(target=self._do_build, args=(params,), daemon=True)
    thread.start()

子線(xiàn)程中的命令輸出需要實(shí)時(shí)顯示到界面的日志框中。這里有一個(gè) wxPython 的重要限制:不能在子線(xiàn)程中直接操作 GUI 控件,否則會(huì)崩潰。解決方案是用 wx.CallAfter() 把 GUI 操作轉(zhuǎn)發(fā)到主線(xiàn)程:

def log(self, msg, color=None):
    def _append():
        if color:
            self.txt_log.SetDefaultStyle(wx.TextAttr(color))
        self.txt_log.AppendText(msg + "\n")
        if color:
            self.txt_log.SetDefaultStyle(wx.TextAttr(wx.BLACK))

    if wx.IsMainThread():
        _append()
    else:
        wx.CallAfter(_append)

命令的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤被合并后逐行讀取,每讀到一行就調(diào)用 self.log() 追加到日志框,實(shí)現(xiàn)了類(lèi)似終端的實(shí)時(shí)輸出效果。

五、最大的坑:用自己編譯自己

這個(gè)工具本身也是一個(gè) Python 腳本,自然也想把它編譯成 EXE 方便分發(fā)。于是我用這個(gè)工具編譯了它自己——然后遇到了兩個(gè)嚴(yán)重的問(wèn)題。

坑一:無(wú)用 import 引發(fā)的連鎖崩潰

編譯成功了,但雙擊 EXE 運(yùn)行時(shí)彈出錯(cuò)誤:

ModuleNotFoundError: No module named 'pandas'

調(diào)用棧顯示:py2exe.exe → wx.lib.agw.hyperlink → webbrowser → pandas。

問(wèn)題出在代碼頂部的一行:

import wx.lib.agw.hyperlink as hl  # 這行是廢棄代碼,程序中從未使用

這個(gè)模塊內(nèi)部會(huì) import webbrowser,webbrowser 在某些環(huán)境下又會(huì)觸發(fā)對(duì)其他模塊的探測(cè)。PyInstaller 在分析依賴(lài)時(shí)被誤導(dǎo),認(rèn)為程序需要 pandas,但打包時(shí)并沒(méi)有包含它,運(yùn)行時(shí)就報(bào)錯(cuò)了。

教訓(xùn):永遠(yuǎn)不要在代碼中留無(wú)用的 import 語(yǔ)句。 它不僅浪費(fèi)資源,在 PyInstaller 打包場(chǎng)景下還可能引發(fā)意想不到的錯(cuò)誤。刪掉這一行,問(wèn)題消失。

坑二:EXE 不斷彈出自己的新窗口

刪掉無(wú)用 import 后重新編譯,EXE 可以啟動(dòng)了。選擇一個(gè) .py 文件,點(diǎn)擊編譯——然后又彈出了一個(gè)新的 py2exe 工具窗口。再點(diǎn)編譯,又彈一個(gè)。無(wú)限套娃。

這是一個(gè)經(jīng)典的 PyInstaller 陷阱,根因在于 sys.executable 的行為變化:

# 開(kāi)發(fā)環(huán)境中運(yùn)行 .py 文件時(shí):
sys.executable → "C:\Python310\python.exe"       ? 指向 Python 解釋器

# 打包成 EXE 后運(yùn)行時(shí):
sys.executable → "C:\dist\py2exe.exe"             ? 指向 EXE 自身!

原始代碼中有這樣的語(yǔ)句:

self._run_cmd(f'"{sys.executable}" -m venv "{venv_dir}"')

在開(kāi)發(fā)環(huán)境中,這等價(jià)于 python.exe -m venv xxx,完全正確。但打包后,這變成了 py2exe.exe -m venv xxx——操作系統(tǒng)執(zhí)行了 py2exe.exe,于是又彈出了一個(gè)新的工具窗口。

解決方案:編寫(xiě)一個(gè) find_system_python() 函數(shù),在打包后的環(huán)境中主動(dòng)搜索系統(tǒng)中真正的 Python 解釋器,而不是依賴(lài) sys.executable

def find_system_python():
    # 未打包時(shí)直接返回 sys.executable
    if not getattr(sys, "frozen", False):
        return sys.executable

    # 已打包時(shí),從 PATH、常見(jiàn)安裝路徑、where 命令中搜索
    python_name = "python.exe" if sys.platform == "win32" else "python3"

    # 策略A:遍歷 PATH 環(huán)境變量
    for d in os.environ.get("PATH", "").split(os.pathsep):
        candidate = os.path.join(d, python_name)
        if os.path.isfile(candidate):
            result = subprocess.run([candidate, "--version"],
                                    capture_output=True, text=True, timeout=5)
            if result.returncode == 0 and "Python" in result.stdout:
                return candidate

    # 策略B:Windows 常見(jiàn)安裝路徑
    # 策略C:where/which 命令兜底
    # ...

這個(gè)函數(shù)按三重策略查找:先掃描 PATH 環(huán)境變量中的每個(gè)目錄,再檢查 Windows 常見(jiàn)的 Python 安裝路徑(如 C:\Python310\、用戶(hù) AppData 目錄等),最后用 where python 命令兜底。每個(gè)候選路徑都會(huì)通過(guò)執(zhí)行 python --version 來(lái)驗(yàn)證它確實(shí)是一個(gè) Python 解釋器,并排除 Windows Store 的假 python.exe(位于 WindowsApps 目錄下)。

找到后將其緩存為全局變量 SYSTEM_PYTHON,后續(xù)所有需要調(diào)用 Python 的地方都使用這個(gè)變量。界面頂部也會(huì)顯示檢測(cè)到的 Python 路徑,綠色表示正常,紅色表示未找到,讓用戶(hù)第一時(shí)間知道環(huán)境是否就緒。

六、界面設(shè)計(jì)思路

界面采用了四步式的縱向布局,每一步用 wx.StaticBox 分組框包裹,步驟編號(hào)清晰標(biāo)注:

①  選擇 Python 文件     [文本框] [瀏覽按鈕]
②  依賴(lài)掃描結(jié)果         [勾選列表] [全選/手動(dòng)添加]
③  編譯選項(xiàng)             [EXE名/輸出目錄/圖標(biāo)/打包模式]
④  編譯日志             [實(shí)時(shí)輸出的等寬文本框]
                        [開(kāi)始編譯] [清空日志] [打開(kāi)輸出目錄](méi)

幾個(gè)設(shè)計(jì)細(xì)節(jié)值得一提。依賴(lài)掃描結(jié)果使用 wx.CheckListBox 展示,用戶(hù)可以勾選/取消勾選每個(gè)庫(kù),也可以手動(dòng)添加遺漏的庫(kù)。對(duì)于 import 名和 pip 名不同的庫(kù),顯示時(shí)會(huì)注明對(duì)應(yīng)關(guān)系,例如 wxPython (import wx),讓用戶(hù)一目了然。日志框使用等寬字體和彩色輸出,命令本身用灰色,正常輸出用黑色,成功信息用綠色,錯(cuò)誤信息用紅色,增強(qiáng)了可讀性。編譯完成后會(huì)自動(dòng)報(bào)告 EXE 文件的大小,方便用戶(hù)評(píng)估打包效果。

七、關(guān)鍵代碼細(xì)節(jié)逐段解析

命令執(zhí)行器

def _run_cmd(self, cmd, cwd=None, shell=True):
    self.log(f"> {cmd}", wx.Colour(100, 100, 100))
    proc = subprocess.Popen(
        cmd, shell=shell, cwd=cwd,
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
        text=True, encoding="utf-8", errors="replace"
    )
    for line in proc.stdout:
        line = line.rstrip("\n\r")
        if line:
            self.log(line)
    proc.wait()
    return proc.returncode

這段代碼有幾個(gè)值得注意的設(shè)計(jì)選擇。stderr=subprocess.STDOUT 把標(biāo)準(zhǔn)錯(cuò)誤合并到標(biāo)準(zhǔn)輸出,避免需要同時(shí)讀兩個(gè)管道(那樣容易死鎖)。errors="replace" 確保遇到無(wú)法解碼的字節(jié)時(shí)不會(huì)崩潰,而是用替代字符顯示。逐行讀取 proc.stdout 而不是用 communicate(),實(shí)現(xiàn)了輸出的實(shí)時(shí)顯示。

編譯完成后的清理對(duì)話(huà)框

編譯在子線(xiàn)程中運(yùn)行,但對(duì)話(huà)框必須在主線(xiàn)程中彈出。程序用了一個(gè)簡(jiǎn)潔的同步機(jī)制:

dlg_result = [None]  # 用列表包裹以便在閉包中修改

def ask_cleanup():
    d = wx.MessageDialog(self, "是否刪除虛擬環(huán)境?", ...)
    dlg_result[0] = d.ShowModal()
    d.Destroy()

wx.CallAfter(ask_cleanup)        # 轉(zhuǎn)發(fā)到主線(xiàn)程執(zhí)行
while dlg_result[0] is None:     # 子線(xiàn)程等待用戶(hù)回答
    time.sleep(0.1)

dlg_result 是一個(gè)列表而不是普通變量,因?yàn)?Python 的閉包對(duì)外部變量的賦值需要使用可變?nèi)萜?。子線(xiàn)程通過(guò)輪詢(xún)等待用戶(hù)在主線(xiàn)程的對(duì)話(huà)框中做出選擇。

sys.frozen檢測(cè)

getattr(sys, "frozen", False) 是判斷當(dāng)前程序是否被 PyInstaller 打包的標(biāo)準(zhǔn)方式。PyInstaller 會(huì)在打包后的運(yùn)行環(huán)境中設(shè)置 sys.frozen = Truesys._MEIPASS 屬性。前者用于判斷是否處于打包環(huán)境,后者指向臨時(shí)解壓目錄的路徑。程序中多處使用這個(gè)判斷來(lái)切換行為:

def get_app_dir():
    if getattr(sys, "frozen", False):
        return os.path.dirname(sys.executable)  # 打包后:EXE 所在目錄
    return os.path.dirname(os.path.abspath(__file__))  # 開(kāi)發(fā)時(shí):.py 所在目錄

八、編譯這個(gè)工具本身的正確姿勢(shì)

如果你想把這個(gè)工具自身編譯為 EXE,推薦的命令是:

# 確保環(huán)境干凈
python -m venv venv_build
venv_build\Scripts\activate
pip install pyinstaller wxPython

# 編譯(不要加 --windowed,保留控制臺(tái)方便調(diào)試)
pyinstaller --onefile --clean --name "Py2Exe工具" py2exe.py

# 確認(rèn)無(wú)誤后再加 --windowed 去掉控制臺(tái)
pyinstaller --onefile --windowed --clean --name "Py2Exe工具" py2exe.py

注意事項(xiàng): 運(yùn)行編譯后的 EXE 的電腦上必須安裝有 Python,因?yàn)檫@個(gè)工具需要調(diào)用系統(tǒng) Python 來(lái)創(chuàng)建虛擬環(huán)境和執(zhí)行 PyInstaller。這不是一個(gè)限制,而是設(shè)計(jì)如此——這個(gè)工具的目標(biāo)用戶(hù)本身就是 Python 開(kāi)發(fā)者,他們的電腦上必然有 Python。

九、總結(jié)與可擴(kuò)展方向

這個(gè)項(xiàng)目雖然代碼量不大(約 500 行),但涉及的知識(shí)點(diǎn)非常密集:Python AST 解析、標(biāo)準(zhǔn)庫(kù)與第三方庫(kù)的判別、虛擬環(huán)境的編程式操作、PyInstaller 的命令行參數(shù)、wxPython 的多線(xiàn)程 GUI 編程、以及 PyInstaller 打包后的各種行為差異。

兩個(gè)最核心的教訓(xùn)值得反復(fù)強(qiáng)調(diào)。第一,打包后的 sys.executable 不再是 Python 解釋器,任何依賴(lài)它來(lái)調(diào)用 Python 的代碼都需要做適配。第二,代碼中每一行無(wú)用的 import 都是潛在的炸彈,在打包場(chǎng)景下尤其危險(xiǎn)。

可以繼續(xù)擴(kuò)展的方向包括:支持遞歸掃描多文件項(xiàng)目的所有 import;集成 UPX 壓縮進(jìn)一步減小體積;支持 .spec 文件的可視化編輯;增加對(duì) Nuitka 編譯器的支持作為 PyInstaller 的替代方案等。

完整源代碼已在上文給出,可直接保存運(yùn)行。希望這個(gè)工具和這篇文章對(duì)你有幫助。

這篇博客從架構(gòu)設(shè)計(jì)、AST 依賴(lài)掃描原理、虛擬環(huán)境打包策略、wxPython 多線(xiàn)程 GUI、兩個(gè)經(jīng)典踩坑(無(wú)用 import 和 sys.executable 指向自身) 五個(gè)維度完整解析了這個(gè)工具的實(shí)現(xiàn),既有原理分析也有可直接復(fù)用的代碼片段。

到此這篇關(guān)于從零打造一個(gè)Python圖形化exe編譯工具的踩坑實(shí)錄與完整解析的文章就介紹到這了,更多相關(guān)Python圖形化exe編譯工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • TensorFlow2.1.0安裝過(guò)程中setuptools、wrapt等相關(guān)錯(cuò)誤指南

    TensorFlow2.1.0安裝過(guò)程中setuptools、wrapt等相關(guān)錯(cuò)誤指南

    這篇文章主要介紹了TensorFlow2.1.0安裝時(shí)setuptools、wrapt等相關(guān)錯(cuò)誤指南,本文通過(guò)安裝錯(cuò)誤分析給出大家解決方案,感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • Python使用sklearn庫(kù)實(shí)現(xiàn)的各種分類(lèi)算法簡(jiǎn)單應(yīng)用小結(jié)

    Python使用sklearn庫(kù)實(shí)現(xiàn)的各種分類(lèi)算法簡(jiǎn)單應(yīng)用小結(jié)

    這篇文章主要介紹了Python使用sklearn庫(kù)實(shí)現(xiàn)的各種分類(lèi)算法,結(jié)合實(shí)例形式分析了Python使用sklearn庫(kù)實(shí)現(xiàn)的KNN、SVM、LR、決策樹(shù)、隨機(jī)森林等算法實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 使用Python批量移除Word文檔水印的代碼示例

    使用Python批量移除Word文檔水印的代碼示例

    移除Word文檔中的水印可以減少不必要的麻煩,通過(guò)使用Python這樣的編程語(yǔ)言,我們可以輕松實(shí)現(xiàn)自動(dòng)化操作,高效地移除Word文檔中的水印,確保文檔的專(zhuān)業(yè)性和準(zhǔn)確性,本文將介紹如何使用Python批量移除Word文檔中的水印
    2024-07-07
  • 使用Python實(shí)現(xiàn)IP地址和端口狀態(tài)檢測(cè)與監(jiān)控

    使用Python實(shí)現(xiàn)IP地址和端口狀態(tài)檢測(cè)與監(jiān)控

    在網(wǎng)絡(luò)運(yùn)維和服務(wù)器管理中,IP地址和端口的可用性監(jiān)控是保障業(yè)務(wù)連續(xù)性的基礎(chǔ)需求,本文將帶你用Python從零打造一個(gè)高可用IP監(jiān)控系統(tǒng),感興趣的小伙伴可以了解下
    2025-04-04
  • Python?內(nèi)置模塊?argparse快速入門(mén)教程

    Python?內(nèi)置模塊?argparse快速入門(mén)教程

    argparse模塊是Python內(nèi)置的用于命令項(xiàng)選項(xiàng)與參數(shù)解析的模塊,argparse模塊可以讓人輕松編寫(xiě)用戶(hù)友好的命令行接口,能夠幫助程序員為模型定義參數(shù),這篇文章主要介紹了快速入門(mén)Python內(nèi)置模塊argparse,需要的朋友可以參考下
    2023-06-06
  • pandas 獲取季度,月度,年度首尾日期的方法

    pandas 獲取季度,月度,年度首尾日期的方法

    下面小編就為大家分享一篇pandas 獲取季度,月度,年度首尾日期的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python pandas KeyError: index的錯(cuò)誤問(wèn)題解決

    python pandas KeyError: index的錯(cuò)誤問(wèn)題解決

    本文主要介紹了python pandas KeyError: index的錯(cuò)誤問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • 使用jupyter notebook直接打開(kāi).md格式的文件

    使用jupyter notebook直接打開(kāi).md格式的文件

    這篇文章主要介紹了使用jupyter notebook直接打開(kāi).md格式的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python全棧之學(xué)習(xí)MySQL(1)

    Python全棧之學(xué)習(xí)MySQL(1)

    這篇文章主要為大家介紹了Python全棧之MySQL,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • pandas round方法保留兩位小數(shù)的設(shè)置實(shí)現(xiàn)

    pandas round方法保留兩位小數(shù)的設(shè)置實(shí)現(xiàn)

    本文主要介紹了pandas round方法保留兩位小數(shù)的設(shè)置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

望江县| 无极县| 海晏县| 乐业县| 上虞市| 万盛区| 蒙阴县| 尖扎县| 西和县| 德化县| 县级市| 外汇| 二连浩特市| 水城县| 贺兰县| 寿阳县| 林州市| 镇江市| 赣榆县| 饶河县| 林周县| 诸暨市| 咸宁市| 新民市| 潼南县| 天气| 江阴市| 仁化县| 保亭| 延津县| 惠安县| 黄平县| 广平县| 东阿县| 油尖旺区| 辉县市| 富民县| 本溪| 湛江市| 淳安县| 沭阳县|