0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Python訪問(wèn)CANoe COM接口實(shí)踐

北匯信息POLELINK ? 2022-07-27 16:16 ? 次閱讀

CANoe提供的COM接口使得外部腳本能夠訪問(wèn)或控制CANoe軟件,從而實(shí)現(xiàn)自動(dòng)化測(cè)試任務(wù),而易用且具有豐富生態(tài)的Python無(wú)疑是一個(gè)很好的選擇。本文將介紹CANoe COM基本構(gòu)成、常用COM對(duì)象以及Python腳本調(diào)用CANoe COM的方法,在此之前,先介紹一些基本概念。

CANoe COM Server & Python pywin32

COM全稱Component Object Model,是微軟為Windows平臺(tái)軟件提出的、實(shí)現(xiàn)軟件之間互操作的標(biāo)準(zhǔn)。它不會(huì)規(guī)定軟件的具體實(shí)現(xiàn),而是聲明一種對(duì)象模型,使得滿足這種模型的對(duì)象之間能交互,這些對(duì)象通常被稱為組件(Component)。組件會(huì)實(shí)現(xiàn)特定的功能,而這些功能以特定的方式提供——即接口(Interface),其他組件通過(guò)接口使用它們。另外,組件需要經(jīng)過(guò)注冊(cè)(Registry),才能被其他軟件發(fā)現(xiàn)和使用。注冊(cè)后的組件向其他軟件提供服務(wù),因此組件將作為服務(wù)端(COM Server),其他想要使用服務(wù)的作為客戶端(COM Client)。

在安裝完成CANoe軟件后,CANoe已經(jīng)在Windows組件服務(wù)管理器中注冊(cè)了CANoe COM Server,如果需要重新注冊(cè),可以在安裝目錄下(默認(rèn)為C:\Program Files\Vector CANoe 14)的Exec64文件夾中找到RegisterComponents.exe,運(yùn)行即手動(dòng)注冊(cè)。

Python pywin32 package,它提供了許多Python擴(kuò)展以調(diào)用Windows API,其中就包括COM組件,由于Python腳本將使用CANoe COM提供的服務(wù),因此Python腳本將作為COM Client,在pywin32包中就對(duì)應(yīng)win32com.client模塊,所以后續(xù)的Python腳本都要導(dǎo)入win32com.client模塊。

了解以上的概念后,下面就看看本文的主要內(nèi)容。

pYYBAGLg7OiAX3hXAAChV76gGck623.png

COM Object Hierarchy

在CANoe中,各個(gè)功能模塊按照一定的層級(jí)組織在一起構(gòu)成整個(gè)CANoe軟件。與這些功能模塊直接相關(guān)的COM組件同樣也是按照相應(yīng)的層級(jí)組織的,這就形成了COM Object Hierarchy:

poYBAGLg8J2AKnA5AADbEoPKEKo004.png

如上圖所示,圖的最左側(cè)是Application對(duì)象,是訪問(wèn)其他對(duì)象的入口;通過(guò)它可以訪問(wèn)Configuration對(duì)象,而通過(guò)Configuration對(duì)象才能訪問(wèn)CommunicationSetup對(duì)象;要想設(shè)置CommunicationSetup,就需要按照Application->Configuration->CommunicationSetup從左向右的層級(jí)順序,找到相應(yīng)的屬性或是方法,從而實(shí)現(xiàn)設(shè)置。

Type Library

了解COM Object Hierarchy能幫助快速找到所需功能,但是不能知道實(shí)現(xiàn)所需功能對(duì)象的繼承關(guān)系,為此還需要了解CANoe Type Library。在CANoe軟件安裝目錄下(默認(rèn)為C:\Program Files\Vector CANoe 14)的Exec32\COMdev目錄中包含了注冊(cè)COM所用的類型庫(kù),如下圖所示CANoe.h頭文件:

poYBAGLg7R6ACw1WAADTuWhPk9w203.png

在CANoe.h頭文件中包含所有CANoe COM對(duì)象的接口定義,比如ITestConfiguration接口:

pYYBAGLg7SiAU0cjAALZLJAolMk380.png

而如果想要設(shè)置TestConfigurationSettings對(duì)象,從COM Object Hierarchy得知需要從TestConfiguration對(duì)象訪問(wèn):

poYBAGLg8LSAfeNaAABtffi7y-Q175.png

但是在Type Library中Configuration對(duì)象有多個(gè)ITestConfiguration接口,比如:

poYBAGLg8MCAbRGJAAH6itW-pwM972.png

可以看到,ITestConfiguration2繼承自ITestConfiguration,在它的基礎(chǔ)上又?jǐn)U充了許多方法,比如獲取TestConfigurationSettings對(duì)象的方法get_Settings就在其中。

也就是說(shuō),要通過(guò)實(shí)現(xiàn)了ITestConfiguration2接口的TestConfiguration對(duì)象的get_Settings方法,才能獲得TestConfigurationSettings對(duì)象。

為此,通過(guò)win32com.client模塊中的CastTo方法,能將TestConfiguration轉(zhuǎn)換成基于ITestConfiguration2接口的對(duì)象。

COM Object

COM Object Hierarchy中有許多COM對(duì)象,短時(shí)間內(nèi)掌握所有COM對(duì)象是不現(xiàn)實(shí)的,下面僅針對(duì)常用的、與自動(dòng)化測(cè)試緊密相關(guān)的COM對(duì)象做介紹。

Application

使用Python控制CANoe,首先要獲取關(guān)聯(lián)整個(gè)CANoe進(jìn)程的COM對(duì)象,也就是Application對(duì)象。通過(guò)Dispatch方法就可以獲得關(guān)聯(lián)到當(dāng)前CANoe進(jìn)程的COM對(duì)象,如果當(dāng)前并沒(méi)有CANoe進(jìn)程,則會(huì)啟動(dòng)一個(gè)CANoe進(jìn)程;而如果想要另外獲得一個(gè)CANoe進(jìn)程,則可以使用DispatchEx方法。

下面是獲取Application對(duì)象的代碼示例:

poYBAGLg7WGAEQHSAACF_vWOyQ4383.png

在以上示例中,CANoe各部分功能封裝在CANoe類中,在CANoe類初始化時(shí),把獲得的Application對(duì)象保存在CANoe類的App成員中,這樣在CANoe類的其他方法中,就可以通過(guò)使用App成員來(lái)訪問(wèn)Application對(duì)象。

有了Application對(duì)象,才能訪問(wèn)CANoe工程的各個(gè)功能模塊,比如打開CANoe工程:

poYBAGLg7WuAXl-AAABdhdMnZog652.png

而在open_canoe_config方法中,使用Application對(duì)象的Open方法打開特定的CANoe工程,具體Application對(duì)象的接口定義(這里僅展示IApplication的部分方法,其他方法以及后續(xù)擴(kuò)展的方法并未展示)如下:

pYYBAGLg8NmAcLVDAAOjr83HxcE392.png

Measurement

要想控制CANoe啟動(dòng)測(cè)量,就需要獲取Measurement對(duì)象,對(duì)于上面獲得的Application對(duì)象,使用self.App.Measurement獲得。

在Measurement對(duì)象的接口定義中,可以看到Start方法,使用Measurement.Start()就能啟動(dòng)CANoe測(cè)量。

pYYBAGLg8O-Aet5KAAJaMzIXbCM760.png

下面是啟動(dòng)CANoe測(cè)量的代碼示例:

poYBAGLg7aCAA2g9AABJHk5zdhA132.png

System Variables

系統(tǒng)變量作為CANoe中重要的部分,要想獲取任意系統(tǒng)變量的值,就要獲取對(duì)應(yīng)系統(tǒng)變量的對(duì)象。

pYYBAGLg7bWAA1CnAAAdIla0OOg379.png

從COM Object Hierarchy中可以看到,系統(tǒng)變量Variable對(duì)象是按照Application->System->Namespaces->Namespace->Variables->Variable順序訪問(wèn)的。

其中Namespaces和Variables分別表示Namespace和Variable對(duì)象的集合,因此可以使用Namespace名稱(Variable名稱)作為索引,從Namespaces(Variables)中獲得相應(yīng)的Namespace(Variable)對(duì)象。

pYYBAGLg8QaABmkeAAI3s_TWAow842.png

pYYBAGLg8RiAPlT-AAJR-CZ3Rjs323.png

另外,在Variable對(duì)象的接口定義中,可以看到get_Value和put_Value方法,而Python將這兩種方法轉(zhuǎn)變成了Value屬性,也就是說(shuō)可以直接對(duì)Variable.Value取值或賦值。

pYYBAGLg8SiAOdh8AAF_k7D6tg0115.png

下面是獲得系統(tǒng)變量值的代碼示例:

pYYBAGLg7eOAO5qmAADfvW0SyQo840.png

在以上示例中,添加了簡(jiǎn)單的異常處理可以暫且不看,僅考察if分支中的語(yǔ)句。首先,使用self.App.System.Namespaces獲得Namespaces對(duì)象,將其保存在system_namespaces變量中;然后使用剛保存的變量,以ns_name作為索引獲得Namespace對(duì)象并保存在sys_namespace變量中;再通過(guò)sysvar_name索引獲得Variable對(duì)象sys_variable,最后返回sys_variable.Value屬性值。

Test Configuration & Test Unit

pYYBAGLg7fmAL1JKAAAaklYqEvA671.png

與自動(dòng)化測(cè)試(這里僅介紹Test Configuration配置,即與vTESTstudio軟件聯(lián)合使用的自動(dòng)化測(cè)試)直接相關(guān)的就是Test Configuration以及Test Unit,前者對(duì)應(yīng)整個(gè)測(cè)試執(zhí)行的設(shè)置,后者包含具體執(zhí)行的測(cè)試用例。在COM Object Hierarchy中可以看到,它們的層級(jí)構(gòu)成為Application->Configuration->TestConfigurations->TestConfiguration->TestUnits->TestUnit:

poYBAGLg7hGAfnVjAABRhyYSQEc178.png

其中,TestConfigurations與TestUnits跟前文類似,表示TestConfiguration和TestUnit的集合,同樣可以通過(guò)索引訪問(wèn)。除了可以使用相應(yīng)TestConfiguration(TestUnit)名稱作為索引以外,還能使用數(shù)字索引,但是切記索引起始為1。對(duì)于僅有一個(gè)TestConfiguration的情況,僅需要TestConfigurations(1)來(lái)獲得唯一的TestConfiguration對(duì)象。

當(dāng)CANoe工程中還沒(méi)有TestConfiguration或者TestUnit時(shí),就需要先添加。查看它們的接口定義:

pYYBAGLg7laAd20kAAJKb06Gq-k508.png

pYYBAGLg7muAZZ1eAAE6RU1_1DQ140.png

可以看到Add方法能添加相應(yīng)的對(duì)象,對(duì)于TestConfigurations.Add()不需要其他參數(shù),即可添加并獲得新的TestConfiguration對(duì)象;而TestUnits.Add()需要提供所要添加的TestUnit的絕對(duì)路徑,同樣可以獲得對(duì)應(yīng)的TestUnit對(duì)象。另外值得注意的是,TestUnits的Add方法是在ITestUnits2接口上擴(kuò)展的,所以要通過(guò)前文所述的CastTo方法將TestUnits(默認(rèn)為基于ITestUnits接口)轉(zhuǎn)換成基于ITestUnits2的對(duì)象。

下面請(qǐng)看加載測(cè)試配置的代碼示例:

pYYBAGLg7o6AECd5AACSwL0vycw577.png

在以上示例中,首先通過(guò)TestConfigurations.Add()方法新添加一個(gè)TestConfiguration對(duì)象,并把它保存為類成員self.test_config;之后使用CastTo方法將新添加的TestConfiguration中的TestUnits對(duì)象轉(zhuǎn)換成基于ITestUnits2接口的TestUnits對(duì)象(默認(rèn)為ITestUnits接口);最后使用轉(zhuǎn)換后的TestUnits對(duì)象的Add方法,添加test_unit_path路徑下的測(cè)試單元(.vtuexe文件)。

加載測(cè)試配置后,還需要啟動(dòng)測(cè)試執(zhí)行,查看ITestConfiguration接口定義,可以發(fā)現(xiàn)Start方法:

poYBAGLg7qqAdIOvAAMOlRk15uw039.png

下面是執(zhí)行測(cè)試的代碼示例(這里使用了之前保存的類成員self.test_config):

poYBAGLg7rWAN2_6AABJR5xLQF0460.png

執(zhí)行完測(cè)試后,需要獲得測(cè)試結(jié)果,可以通過(guò)CANoe軟件為Test Configuration創(chuàng)建的系統(tǒng)變量VerdictSummary查看:

pYYBAGLg7r6ADYyfAACDw1OmFww375.png

下面是獲得測(cè)試結(jié)果的代碼示例:

pYYBAGLg7siAKChyAABd-KrA_vM375.png

這里get_test_result方法有一個(gè)帶有默認(rèn)值的參數(shù)test_config_name表示實(shí)際執(zhí)行測(cè)試的TestConfiguration名稱,它的默認(rèn)值是Test_Configuration_1,如果沒(méi)有修改過(guò)就不需要提供參數(shù),否則需要提供;get_test_result返回保存在VerdictSummary中的測(cè)試結(jié)果,其數(shù)據(jù)類型是整型,需要在接口定義中查詢具體數(shù)值對(duì)應(yīng)的結(jié)果:

poYBAGLg7tSAagUcAAEDGX2Fl1o530.png

Test demo

聯(lián)合使用上述COM對(duì)象就能夠?qū)崿F(xiàn)自動(dòng)化測(cè)試,下面展示完整的代碼示例:

pYYBAGLg7uCAaV6mAALQg54cWjk045.png

基于Canoe類,就可以通過(guò)實(shí)例化Canoe類,調(diào)用實(shí)例對(duì)象的方法來(lái)實(shí)現(xiàn)自動(dòng)化測(cè)試,下面是簡(jiǎn)單的代碼示例:

pYYBAGLg7uuAXjnJAADb4zITdKE658.png

首先,實(shí)例化Canoe類,將實(shí)例化后的對(duì)象保存在canoe變量中;之后定義了canoePrj變量表示CANoe工程的絕對(duì)路徑,然后使用open_canoe_config方法打開此工程;接著定義testPrj變量表示測(cè)試單元可執(zhí)行文件的絕對(duì)路徑,使用load_test_config方法加載測(cè)試單元;然后使用start_canoe方法啟動(dòng)CANoe測(cè)量,等待2s后,使用run_test_config方法執(zhí)行測(cè)試,等待10s后測(cè)試停止;最后打印通過(guò)get_test_result方法獲得的測(cè)試結(jié)果。

這里使用了Vector CANoe 14自帶的PythonBasicEmpty.cfg demo工程作為測(cè)試工程,下面是關(guān)于此demo的介紹文檔:

pYYBAGLg7veARhCqAAC7T15Sypk188.png

這個(gè)demo中有更豐富的COM對(duì)象的應(yīng)用、更完善的信息提示,比如對(duì)測(cè)試啟動(dòng)、停止等事件的控制,對(duì)CANoe運(yùn)行狀態(tài)的打印,在此不再贅述。

最后,運(yùn)行以上腳本后,可以獲得自動(dòng)化測(cè)試結(jié)果,對(duì)照前文的VerdictState,可以確定測(cè)試通過(guò):

poYBAGLg7v-AYYHkAAAK7g6l-W8747.png

pYYBAGLg7xKAX6qaAACN66v6raU589.png

總結(jié)

本文介紹了使用Python訪問(wèn)CANoe COM以實(shí)現(xiàn)自動(dòng)化測(cè)試的基本方法,通過(guò)幾個(gè)常用的COM對(duì)象及方法,構(gòu)建了簡(jiǎn)單的自動(dòng)化測(cè)試示例工程。對(duì)于更復(fù)雜的工程,同樣可以根據(jù)基本方法,靈活運(yùn)用COM以滿足測(cè)試需求。進(jìn)一步,可以將CANoe COM封裝成Python庫(kù),利用可復(fù)用性高效地完成針對(duì)不同需求的自動(dòng)化測(cè)試。

CANoe是德國(guó)Vector公司出的一款總線開發(fā)環(huán)境,是網(wǎng)絡(luò)和ECU開發(fā)、測(cè)試和分析的專業(yè)工具,支持從需求分析到系統(tǒng)實(shí)現(xiàn)的整個(gè)系統(tǒng)開發(fā)過(guò)程;其豐富的功能和配置選項(xiàng)被OEM和供應(yīng)商的網(wǎng)絡(luò)設(shè)計(jì)工程師、開發(fā)工程師和測(cè)試工程師所廣泛使用。

北匯信息作為Vector中國(guó)的合作伙伴,不僅提供相應(yīng)的工具和技術(shù)支持服務(wù)及培訓(xùn),還針對(duì)不同的應(yīng)用提供相應(yīng)的解決方案,助力中國(guó)客戶的研發(fā)效率提升。

注:本文部分圖片來(lái)自Vector。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84077
  • CANoe
    +關(guān)注

    關(guān)注

    4

    文章

    64

    瀏覽量

    8537
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    變頻器com接口的接線方法

    變頻器是一種將工頻電源變換為任意頻率、任意電壓的交流電源,以實(shí)現(xiàn)對(duì)交流電機(jī)的調(diào)速和控制的設(shè)備。變頻器的COM接口是變頻器與外部設(shè)備進(jìn)行通信的接口,通常用于與PLC、觸摸屏、計(jì)算機(jī)等設(shè)備進(jìn)行通信
    的頭像 發(fā)表于 07-19 14:42 ?976次閱讀

    CANoe中Logging模塊使用方法及妙招

    Logging是CANoe軟件中的數(shù)據(jù)記錄模塊,主要在臺(tái)架測(cè)試中使用,支持CAN/CANFD、LIN、FlexRay以及車載以太網(wǎng)總線的數(shù)據(jù)記錄。常用的數(shù)據(jù)記錄儀還有GL數(shù)據(jù)記錄儀,GL有自己?jiǎn)为?dú)
    的頭像 發(fā)表于 05-23 08:25 ?859次閱讀
    <b class='flag-5'>CANoe</b>中Logging模塊使用方法及妙招

    CANoe軟件的使用操作說(shuō)明

    本文檔是CANoe軟件的使用操作說(shuō)明,方便剛接觸CANoe的伙伴們快速上手使用這個(gè)軟件。
    的頭像 發(fā)表于 02-25 14:30 ?8924次閱讀
    <b class='flag-5'>CANoe</b>軟件的使用操作說(shuō)明

    TC1728沒(méi)有LIN接口,只有UART接口,可以用UART接口實(shí)現(xiàn)LIN接口嗎?

    TC1728沒(méi)有LIN接口,只有UART接口。可以用UART接口實(shí)現(xiàn)LIN接口嗎?
    發(fā)表于 02-06 06:51

    CanoE和TC3x7應(yīng)用套件之間建立通信,如何實(shí)現(xiàn)通過(guò)串行通信從CanoE收到的數(shù)據(jù)幀?

    我想在 CanoE 和 TC3x7 應(yīng)用套件之間建立通信。 我希望開發(fā)板打印它通過(guò)串行通信從 CanoE 收到的數(shù)據(jù)幀。 我該怎么做? 我是初學(xué)者,請(qǐng)幫忙。
    發(fā)表于 01-31 06:36

    python中text的用法

    可以使用text(字符串)進(jìn)行各種操作,例如創(chuàng)建、訪問(wèn)、修改、連接、比較和搜索等。下面將詳細(xì)介紹Python中使用text的各種用法。 創(chuàng)建和訪問(wèn)文本: 在Python中,我們可以使用
    的頭像 發(fā)表于 11-23 15:46 ?2622次閱讀

    PythonCANoe/CANoe4SW

    Python作為功能強(qiáng)大的編程語(yǔ)言,在智能汽車研發(fā)和測(cè)試中應(yīng)用廣泛,如數(shù)據(jù)處理、測(cè)試自動(dòng)化、測(cè)試腳本開發(fā),甚至直接將Python應(yīng)用運(yùn)行在車輛上。CANoe產(chǎn)品體系為汽車行業(yè)XiL測(cè)試提供豐富功能
    的頭像 發(fā)表于 11-16 08:25 ?1573次閱讀
    <b class='flag-5'>Python</b>與<b class='flag-5'>CANoe</b>/<b class='flag-5'>CANoe</b>4SW

    如何使用AT32F407以太網(wǎng)通信接口實(shí)現(xiàn)在應(yīng)用中編程(IAP)

    如何使用AT32F407以太網(wǎng)通信接口實(shí)現(xiàn)在應(yīng)用中編程(IAP)
    的頭像 發(fā)表于 11-07 17:20 ?1340次閱讀
    如何使用AT32F407以太網(wǎng)通信<b class='flag-5'>接口實(shí)</b>現(xiàn)在應(yīng)用中編程(IAP)

    基于XML語(yǔ)言描述的接口實(shí)現(xiàn)方法

    電子發(fā)燒友網(wǎng)站提供《基于XML語(yǔ)言描述的接口實(shí)現(xiàn)方法.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 10:39 ?0次下載
    基于XML語(yǔ)言描述的<b class='flag-5'>接口實(shí)</b>現(xiàn)方法

    PyJNIus :讓你在Python中輕松調(diào)用Java方法

    PyJNIus 是一個(gè)神奇的 Python 第三方模塊。它能使用Java本地接口將Java類作為Python訪問(wèn)Python模塊。 如果
    的頭像 發(fā)表于 11-01 10:45 ?664次閱讀

    PyJNIus:在Python中輕松調(diào)用Java方法

    PyJNIus 是一個(gè)神奇的 Python 第三方模塊。它能使用Java本地接口將Java類作為Python訪問(wèn)Python模塊。 如果
    的頭像 發(fā)表于 10-30 11:32 ?671次閱讀

    如何使用Python獲得市場(chǎng)的交易日歷

    ,本模塊最低支持的Python版本為3.8. 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章: 超詳細(xì)Python安裝指南 進(jìn)行安裝。
    的頭像 發(fā)表于 10-21 10:37 ?1458次閱讀

    基于以太網(wǎng)網(wǎng)絡(luò)接口卡VN5600A的CSM數(shù)采設(shè)備與CANape、CANoe的配置方案

    客戶在實(shí)際應(yīng)用中需要使用CANoe或者CANape/vMeasure結(jié)合CSM的ECAT模塊對(duì)數(shù)據(jù)進(jìn)行采集,而且往往需要面對(duì)多路以太網(wǎng)的數(shù)據(jù)采集場(chǎng)景。針對(duì)以上特定需求,本文以VN5610A接口卡為例, 分別搭建CANoe和CAN
    的頭像 發(fā)表于 10-16 10:42 ?1328次閱讀
    基于以太網(wǎng)網(wǎng)絡(luò)<b class='flag-5'>接口</b>卡VN5600A的CSM數(shù)采設(shè)備與CANape、<b class='flag-5'>CANoe</b>的配置方案

    CANoe控制OUTMM輸出固定電壓的方法

    實(shí)際應(yīng)用中需要使用CANoe控制OUTMM輸出固定電壓,本文介紹具體實(shí)現(xiàn)的方法。
    的頭像 發(fā)表于 10-09 09:55 ?680次閱讀
    <b class='flag-5'>CANoe</b>控制OUTMM輸出固定電壓的方法

    Python編程實(shí)用指南

    Python 是一種解釋型、面向?qū)ο蟆?dòng)態(tài)數(shù)據(jù)類型的高級(jí)程序設(shè)計(jì)語(yǔ)言。通過(guò) Python 編程,我們能夠解決現(xiàn)實(shí)生活中的很多任務(wù)。本書是一本面向實(shí)踐Python 編程實(shí)用指南。本書
    發(fā)表于 09-27 06:21