色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python軟件包要在選定的構建(Build)系統上運行時,應該如何指定其依賴關系

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-05-25 17:31 ? 次閱讀

摘要

本PEP詳細說明了Python軟件包要在選定的構建(Build)系統上運行時,應該如何指定其依賴關系。本規范引入了一個新的配置文件,用于指定軟件包的構建依賴關系(假定今后的配置會使用相同的配置文件作為參考)。

基本原理

當Python首次開發用于構建項目、軟件分發的工具時,distutils [1]是選定的解決方案。隨著時間的推移,setuptools [2]越來越流行,它在distutils的基礎上增加了一些功能。兩者都應用了setup.py文件這樣一個概念。項目維護人員通過執行這個文件來構建其軟件的發行版(使得用戶也能夠安裝上述發行版)。

distutils是Python標準庫的一部分,所以,使用一個可執行文件來指定distutils下的構建條件是沒有問題的。將構建工具作為Python的一部分意味著,項目維護人員如果要構建一個項目的發行版,無需擔心setup.py有哪些外部依賴項。唯一的依賴項只是Python,因此沒有必要指定任何依賴信息

但是當一個項目選擇使用setuptools時,像setup.py這樣的可執行文件的使用就成了一個問題。你無法在不知道setup.py文件依賴關系的條件下執行它。可是,目前還沒有標準的方法,在不執行存儲著依賴信息的setup.py文件的情況下,自動地了解它具體有哪些依賴項。這就形成了一個悖論:你不運行這個文件,你就無法知道它的內容;你不知道這個文件的內容,就無法運行它。

setuptools嘗試用它的setup() 函數的setup_requires參數來解決這個問題[3]。 此解決方案有許多問題,例如:

除了setuptools本身,沒有工具可以在不執行setup.py的情況下訪問這些信息,但是如果不安裝這些項目,setup.py將無法執行。

盡管setuptools本身會安裝setup.py中列出的一切,但在執行setup() 函數期間,它們將不會被安裝,這意味著實際使用此處添加的任何東西的唯一方法是通過越來越復雜的機制來延遲導入和使用,直到后來執行setup() 函數為止。

該方案不包括setuptools本身,也不能包括setuptools的替代品,這意味著像numpy.distutils這樣的項目很大程度上無法利用它,項目不能利用較新的setuptools功能,直到用戶自然地將setuptools的版本升級到較新的版本。

setup_requires中列出的項目只要執行setup.py就會被安裝,但執行setup.py的常見方式是通過另一個工具,比如已經負責管理依賴關系的pip。 這意味著像pip install spam這樣的命令可能最終導致pip和setuptools下載和安裝軟件包,最終,用戶需要配置這兩個工具(并且不受控制地調用setuptools)來更改它安裝的存儲庫等設置。 這也意味著用戶需要了解這兩種工具的發現規則,因為每個工具可能支持不同的軟件包格式或以不同方式確定最新版本。

這導致了setup_requires很少被人使用的情況,在這種情況下,項目傾向于只是在多個setup.py文件之間復制和粘貼代碼片段,或者完全跳過,僅僅只在某個地方記錄好--希望用戶在嘗試建立或安裝他們的項目之前,已經手動安裝好這些內容。

所有這一切使得pip [4]假定在執行setup.py文件時setuptools是存在的。但問題在于,如果另一個項目像setuptools那樣開始在社區中獲得關注,這個項目就沒有可擴展性。如此一來,會阻止其他項目獲得應有的關注。因為當pip無法推斷出項目需要的是除setuptools以外的某個東西時,使用setuptools便會產生沖突。

本PEP試圖在特定文件中、以一種聲明式的方式顯式列出項目構建系統的最小依賴關系,從而解決當前的狀況。此舉允許項目列出它必須具有何種構建依賴關系。例如,源代碼簽出到wheel,同時不落入setup.py所形成的悖論中。即,工具無法推斷項目需要自行構建的東西。實施本PEP將允許項目預先指定他們依賴的構建系統,以便像pip這樣的工具可以確保所有依賴條件已經安裝,以便運行構建系統來進行構建。

為了提供更多的上下文和推動本PEP,可以把所需的(大體)步驟看成是生成一個手工項目的過程:

項目的源代碼簽出

構建系統的安裝

構建系統的運行

本PEP涵蓋了第2步。 預計未來的PEP將包括第3步,包括如何使構建系統動態指定構建系統執行其工作所需的更多依賴性。 但是,本PEP的目的是為構建系統指定要開始運行所需的最低要求。

規范

構建系統的依賴關系將存儲在一個名為pyproject.toml的文件中,該文件以TOML格式編寫[6]。選擇這種格式是因為它可供人來使用(不像JSON [7]),它足夠靈活(不像configparser [9])起源于某個標準(也不像configparser [9]),不過于復雜(不像YAML [8])。 TOML格式已被Rust社區用作其包管理器的一部分[14],據私人電郵所述,他們對選擇TOML感到非常滿意。關于為什么不選擇各種替代品的更詳細的討論可以閱讀以下其他文件格式的部分。

在配置文件中將會有一個[build-system]表來存儲與構建相關的數據。最初,表中只有一個關鍵字是有效的和必需的:requires。該鍵將包含一個字符串列表的值,代表執行構建系統所需的PEP 508依賴條件(意味著執行setup.py文件需要哪些依賴條件)。

以下的JSON架構[15]將與數據格式匹配,表示了某個特定類型的結果數據。這些數據來自于僅供演示用的TOML文件:

對于絕大多數依賴setuptools的Python項目,pyproject.toml文件會是這個樣子:

目前社區中setuptools和wheel的使用非常廣泛,所以當pyproject.toml文件不存在時,構建工具將使用上面的示例配置文件作為它們的默認語義。

除了[tool]表格,所有其他頂級密鑰和表格被保留下來,供其他的PEP將來使用。在[tool]表格中,只要使用了[tool]中的子表,工具就允許用戶指定其配置數據,例如,名為flit的工具會將其配置存儲在[tool.flit]中。

我們需要一些機制來在工具中分配tool.*命名空間中的名稱,以確保不同的項目不會嘗試使用相同的子表產生沖突。 我們的規則是:當且僅當一個項目擁有Cheeseshop / PyPI中的$NAME條目時,它才可以使用子表tool.$NAME。

一些未接受的想法

語義版本號

為了將來驗證配置文件的結構,最初提出了語義版本號。 默認值是1,背后的想法是:如果發生了針對之前定義的密鑰或表格的語義變化,而這些變化不向后兼容,則語義版本將增加一個新的數字。

但最終卻認定這是一個不成熟的優化。 我們的預期是,在配置文件中對語義上預先定義的內容的更改將是相當保守的。 在發生向后不兼容的變化的情況下,可以使用不同的名稱作為新的語義,以避免破壞舊的工具。

一個嵌套更深的命名空間

這個PEP的早期草案有一個頂級[Package]表。 想法是為語義版本方案限定范圍(請參閱語義版本關鍵字來了解這個想法被拒絕的原因)。 由于不再需要范圍的限定,因此擁有頂級表的重要性變得多余。

其他表名[build-system]表的另一個名字是[build]。替代名稱較短,但并未表達信息存儲在表中的意圖。 經過distutils-sig郵件列表上發起的投票,當前的名稱勝出。

其他文件格式

提出了其他幾種文件格式供考慮,都因各種原因而被拒絕。 關鍵要求是該格式可以由人進行編輯,且可以通過項目落地。 這徹底排除了某些格式,如對人類不友好的XML,而且從未認真討論過。

JSON

JSON格式[7]起初納入考慮,但很快被拒絕。 盡管作為基于字符串的人類可讀的數據交換格式非常好,但語法本身并不適合人類做簡單的編輯(例如,語法比所需的更冗長而不允許有注釋)。

提議的數據的示例JSON文件將是:

YAML

YAML格式[8]被設計為JSON的超集[7],同時更易于手工操作。 YAML有三個主要問題。

一個是規范太多:如果打印在letter尺寸的紙上,則為86頁。這就使得有人可能會使用YAML的功能與一個解析器一起工作,而不是另一個解析器。有人建議在一個子集上進行標準化,但這基本上意味著要創建一個特定于該文件的新標準,這個標準是不容易長期處理的。

二是YAML默認本身并不安全。該規范允許在處理配置數據時最好避免代碼的任意執行。當然可以避免這種行為 - 例如,PyYAML提供了一個safe_load操作 - 但是如果任何工具不小心使用load,那么它們會自行開啟任意代碼執行。雖然這個PEP專注于構建固有涉及代碼執行的項目,但其他配置數據(如項目名稱和版本號)最終可能會在相同的文件中隨意執行任意代碼。

最后,最流行的YAML的Python實現是PyYAML [10],它是一個包含幾千行代碼的大型項目,也是一個可選的C擴展模塊。雖然本身并不一定是個問題,但對于像pip這樣的項目來說,這更像是一個問題,因為他們很可能需要將PyYAML作為依賴項供應商,以便完全獨立(否則,最終會導致您安裝需要安裝工具的工具才能正常工作)。 PyYAML的一個概念驗證已經完成,看看供應一個簡單版本的庫是多么地簡單,這一切表明了一種可能性。

一個YAML示例文件:

Configparser

一個基于configparser INI風格配置文件考[9]。 不幸的是,沒有關于configparser接受什么的規范,導致版本之間的支持不一致。 例如,Python 2.7中的ConfigParser接受的內容與Python 3中的configparser接受的內容不同。 雖然可以標準化Python 3接受的內容,并簡單地供應configparser模塊的backport,但這確實意味著此PEP必須編碼,所有項目希望使用configparser的backport才能使用此PEP指定的元數據。 這是過度限制性的,如果有人不知道預期特定版本的configparser會導致混淆。

一個示例INI文件是:

Python語法

有人提議使用Python語法作為配置格式。 該文件將在頂層包含一個字典,數據全部在該字典中,并且由鍵定義部分。 所有的Python程序員都會習慣這種格式,而且不需要第三方依賴來讀取配置數據,如果用ast.literal_eval()進行解析,它可能是安全的[13]。 Python語法可以與JSON相同,同時支持尾隨逗號和注釋。 另外,Python的更豐富的數據模型可能對未來的某些配置需求非常有用(例如非字符串字典密鑰,浮點數與整數值)。

不過,python語法是Python特有的格式,我們預計這些數據可能需要通過不是用Python編寫的打包工具等來讀取。

提議的Python語法文件示例如下:

其他文件名稱

其他幾個文件名在考慮后并未接受(這是一個非常相似的話題,最終決定主要是根據喜好)。

pysettings.toml

最合理的選擇。

pypa.toml

雖然參考PyPA [11]是有道理的,但這是一個有點用處的術語。沒有特定領域的知識,最好讓文件名有意義。

pybuild.toml

從這個PEP的限制性角度來看,這個文件名是有意義的,但是如果有任何非構建元數據被添加到文件中,那么名稱就不再有意義了。

pip.toml

工具特定。

meta.toml

太通用;項目可能希望擁有自己的元數據文件。

setup.toml

在保持setup.py的傳統感謝的同時,它不一定與未來文件可能包含的內容相匹配(例如,.e.g知道項目名稱是否是其設置的一部分?)。

pymeta.toml

對新手不太明顯。

pypackage.toml&pypackaging.toml

概念混淆,考慮什么才是一個“包”?(項目和包的區別)

pydevelop.toml

該文件可能包含非特定于開發的細節。

pysource.toml

與源代碼沒有直接關系。

pytools.toml

由于該文件(當前)針對項目管理,因此具有誤導性。

dstufft.toml

個體相關性太大

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 軟件包
    +關注

    關注

    0

    文章

    104

    瀏覽量

    11624
  • python
    +關注

    關注

    56

    文章

    4804

    瀏覽量

    84915

原文標題:setup.py即將下崗,PEP 518 說明繼任者

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    安裝依賴Python軟件包時報錯如何解決?

    安裝依賴Python 軟件包,出現了如下錯誤,請問如何解決,謝謝! Command \"E:/msys32/mingw32/bin/python2.7.exe E:/msys3
    發表于 06-26 07:32

    Python多版本兼容性處理方法

    Python目前有兩個主版本并存,這很讓人苦惱。雖然Python 3有許多優于Python 2的特性,但是Python 2的生態系統更為完善
    發表于 04-28 15:42

    汽車電池運行時

    和性能迅速降低。遺憾的是,在大電流電池系統中,為了延長運行時間或實現電池快速充電,均衡電流也必須很大。均衡器效率低下會導致電池系統內部產生有害的熱量,必須通過減少給定時間內可
    發表于 06-11 09:43

    Linux系統安裝軟件的原理與系統結構

    對linux發行版構建思想的一種反映,有時候也是個性塑造的需要,但實際是增加了linux用戶的學習負擔。   最后講講程序的依賴關系,上面說了,要成功
    發表于 07-03 00:53

    LabVIEW哪些軟件需要運行時許可

    LabVIEW哪些軟件需要運行時許可將一些NI的軟件打包到應用程序中,哪些軟件在目標機器運行時
    發表于 02-05 10:23

    使用menuconfig配置基于RT-Thread的NimBLE軟件包

    構建的過程,最終生成的二進制文件可以燒錄到目標板運行。可以看出后續的軟件包更新以及項目構建過程,都依賴
    發表于 06-27 11:18

    mbedTLS軟件包用戶手冊介紹

    (Datagram TLS)傳輸加密軟件框架圖mbedTLS 軟件包提供了一組可以單獨使用和編譯的加密組件,各組件及其可能的依賴關系如下圖所示:軟件
    發表于 08-12 14:34

    運行時軟件故障注入器的設計與實現

    針對實際故障診斷中難以有效獲得故障現場信息的問題,提出通過在軟件運行時注入故障的方式獲取故障現場信息,設計并實現一種運行時軟件故障注入器,給出其中的故障腳本描
    發表于 04-06 08:40 ?19次下載

    Softcar測試軟件包Python語言的集成

    Softcar 和SoftcarRT 是某企業自行研發的測試平臺專用軟件包功能用于車輛內置控制器的性能測試。為了面向更多的用戶,欲采用Python 語句來操作控制Softcar 及SoftcarRT 測試軟
    發表于 05-27 11:41 ?21次下載

    紫金橋組態軟件新的功能_運行時組態

    運行時組態是組態軟件新近提出的新的概念。運行時組態是在運行環境下對已有工程進行修改,添加新的功能。它不同于在線組態,在線組態是在工程運行的同
    發表于 10-13 16:17 ?2次下載
    紫金橋組態<b class='flag-5'>軟件</b>新的功能_<b class='flag-5'>運行時</b>組態

    RT-Thread軟件包定義和使用

    RT-Thread軟件包運行于RT-Thread物聯網操作系統平臺上,面向不同應用領域的通用軟件組件 。RT-Thread 同時提供了開放的軟件包
    的頭像 發表于 05-21 11:29 ?1w次閱讀
    RT-Thread<b class='flag-5'>軟件包</b>定義和使用

    Python官方軟件包存儲庫PyPI遭受了黑客攻擊

    據 BleepingComputer 報道,Python 官方軟件包存儲庫 PyPI 遭受了黑客攻擊,攻擊者通過注入大量垃圾郵件的形式發起了洪水攻擊,這些垃圾郵件及軟件包通過采用電影
    的頭像 發表于 06-15 17:08 ?1629次閱讀
    <b class='flag-5'>Python</b>官方<b class='flag-5'>軟件包</b>存儲庫PyPI遭受了黑客攻擊

    NETWORKX Python編程語言軟件包概述及用途

    NetworkX 是一個 Python 編程語言軟件包,可用于創建、操作和學習復雜圖形網絡的結構、動態和功能。
    的頭像 發表于 07-01 11:30 ?1405次閱讀

    AUTOSAR CP運行時環境與應用軟件

    運行時環境(RTE) AUTOSAR CP運行時環境(RTE)是AUTOSAR架構中的核心組件,它實現了AUTOSAR虛擬功能總線(VFB)的接口,并提供了通信基礎設施和訪問基礎軟件組件(如操作
    的頭像 發表于 10-27 15:44 ?1348次閱讀
    AUTOSAR CP<b class='flag-5'>運行時</b>環境與應用<b class='flag-5'>軟件</b>

    如何保證它們容器運行時的安全?

    緊密耦合的容器運行時繼承了主機操作系統的安全態勢和攻擊面。運行時或主機內核中的任何漏洞及其利用都會成為攻擊者的潛在切入點。
    的頭像 發表于 11-03 15:24 ?702次閱讀
    主站蜘蛛池模板: 看看妇女的B免费看| 青青热久久综合网伊人| 日本护士性生活| 99热精品一区| 欧美另类jizzhd| writeas雷狮直播| 日本一本在线播放| 苍老师刺激的120分钟| 青青草伊人久久| write as 跳蛋| 日日干夜夜爱| 国产精品99久久久久久AV | 国产精品麻豆AV| 无码11久岁箩筣| 国产毛片视频网站| 亚洲色图激情小说| 久久综合色一综合色88| 51国产偷自视频在线视频播放| 麻豆文化传媒一区二区| japanese色系free日本| 揉抓捏打抽插射免费视频| 丰满少妇67194视频| 午夜特级毛片| 九九热精品在线观看| 51精品国产AV无码久久久| 欧美精品做人一级爱免费| 草莓视频app深夜福利| 丝瓜视频在线免费| 护士WC女子撒尿| 4399日本电影完整版在线观看免费| 男生在床上脱美女 胸| 国产AV99激情久久无码天堂| 亚洲精品成人无码区一在线观看| 久久这里只精品热在线18| jizzjizz3d动漫| 亚洲AV永久无码精品老司机蜜桃| 久久久无码精品无码国产人妻丝瓜| rio 快播| 亚洲激情网站| 美女扣逼软件| 国产超碰精久久久久久无码AV|