目錄
1. 為什麼需要對專案分發打包?
#2.包裝分發的始祖:distutils
3. 分發工具升級:setuptools
4. easy_install 使用指南
5. 原始碼包與二進位包什麼區別?
以源碼包的方式發布
#以二進位包形式發布
eggs 與wheels 有什麼區別?
下面进入正题:setup.py
1. 超详细讲解 setup.py 的编写
 关于安装环境的限制
 关于依赖包下载安装
 关于文件的分发
关于程序分类信息
2.生成可执行文件的分发
指定release
3. 如何使用 setup.py 构建包
4. 如何使用 setup.py 安装包
5. 如何发布包到 PyPi?
首頁 後端開發 Python教學 如何使用Python中的setup.py檔?

如何使用Python中的setup.py檔?

May 09, 2023 pm 07:07 PM
python setup.py

1. 為什麼需要對專案分發打包?

平常我們習慣了使用pip 來安裝一些第三方模組,這個安裝過程之所以簡單,是因為模組開發者為我們默默地為我們做了所有繁雜的工作,而這個過程就是 打包

打包,就是將你的原始碼進一步封裝,並且將所有的部署工作都事先安排好,這樣使用者拿到後即裝即用,不用再操心如何部署的問題(如果你不想對照著一堆部署文檔手工操作的話)。

Python 發展了這麼多年了,專案打包工具也已經很成熟了。他們都有哪些呢?

你可能聽過disutils、 distutils 、distutils2、setuptools等等,好像很熟悉,卻又很陌生,他們都是什麼關係呢?

#2.包裝分發的始祖:distutils

distutils 是Python 的一個標準函式庫,從命名上很容易看出它是一個分發(distribute)工具(utlis),它是Python  官方開發的一個分送打包工具,所有後續的打包工具,全部都是基於它進行開發的。

distutils 的精髓在於編寫 setup.py,它是模組分發與安裝的指導檔。

那麼如何寫 setup.py 呢?這裡面的內容非常多,我會在後面進行詳細的解析,請你耐心往下看。

你有可能沒寫過 setup.py ,但你絕對使用過 setup.py 來做一些事情,比如下面這條命令,我們經常用它來進行模組的安裝。

$ python setup.py install
登入後複製

這樣的安裝方法叫做原始碼安裝,與之對應的是透過二進位軟體套件安裝,同樣我也會在後面介紹。

3. 分發工具升級:setuptools

setuptools 是 distutils 增強版,不包含在標準函式庫中。其擴展了許多功能,能夠幫助開發者更好的創建和分發 Python 套件。大部分  Python 用戶都會使用更先進的 setuptools 模組。

distribute,或許你在其他地方也看過它,這裡也提一下。

distribute 是 setuptools 有一個分支版本,分支的原因可能是有一部分開發者認為 setuptools  開發太慢了。但現在,distribute 又合併回了 setuptools 中。因此,我們可以認為它們是同一個東西。

還有一個大包分發工具是 distutils2,其試圖嘗試充分利用distutils,detuptools 和 distribute 並成為 Python  標準庫中的標準工具。但該計劃並沒有達到預期的目的,而且已經是一個廢棄的項目。

因此,setuptools 是一個優秀的,可靠的 Python 套件安裝與分發工具。

透過pycharm建立虛擬環境時,都會預設安裝setuptools工具。

4. easy_install 使用指南

當你安裝完 setuptools 後,就擁有了一個叫做 easy_install 的第三方管理工具,這也是它區分於 distutils  的一大改進。

這裡簡單介紹一下它的用法,雖然它已經用得非常少了。

先是套件的安裝

安装
# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装 
$ easy_install pkg_name  
# 通过包名从指定下载页寻找链接来安装或升级包 
$ easy_install -f http://pythonpaste.org/package_index.html   
# 指定线上的包地址安装 
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz  
# 从本地的 .egg 文件安装 
$ easy_install xxx.egg  
# 在安装时你可以添加额外的参数 指定安装目录:--install-dir=DIR, -d DIR 指定用户安装:--user
 
升级
# 从 pypi 中搜索并升级包 
$ easy_install --upgrade pkg_name  
# 指定版本进行升级 
$ easy_install "SomePackage==2.0"

删除
$ easy_install -m pkg_name
登入後複製

總結一句:setuptools  是官方提供的一個專業用於包分發的工具,只要只從安裝的角度來看,它的功能確實簡單。它更大的意義是對包的分發很有用,而且定製化程序非常高,我們現在也還在用它進行版本包的發布。

5. 原始碼包與二進位包什麼區別?

Python 包的分發可以分為兩種:

以源碼包的方式發布

#以二進位包形式發布

以源碼包的方式發布

安裝以源碼包方式發布的包的過程,是先解壓,再編譯,最後才安裝(上面提到的python setup.py install),所以它是跨平台的,由於每次安裝都要進行編譯,相對二進包安裝方式來說安裝速度較慢。

原始碼包的本質是一個壓縮包,其常見的格式有:

如何使用Python中的setup.py檔?

#以二進位包形式發布

二進位包的安裝過程省去了編譯的過程,直接進行解壓縮安裝,所以安裝速度比原始碼包來說更快。

由於不同平台的編譯出來的套件無法通用,所以在發佈時,需事先編譯好多個平台的套件。

二進位套件的常見格式有:

如何使用Python中的setup.py檔?

eggs 與wheels 有什麼區別?

Egg 格式是由setuptools 在2004 年引入,而Wheel 格式是由PEP427 在2012 年定義。 Wheel 的出現是為了取代  Egg,它的本質是一個zip包,其現在被認為是 Python 的二進位包的標準格式。

以下是 Wheel 和 Egg 的主要區別:

  • Wheel 有一個官方的 PEP427 來定義,而 Egg 沒有 PEP 定義

  • Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import

  • Wheel 文件不会包含 .pyc 文件

  • Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录

  • Wheel 有着更丰富的命名规则。

  • Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现

  • Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易

  • wheel 包可以通过 pip 来安装,只不过需要先安装 wheel 模块,然后再使用 pip 的命令。

$ pip install wheel $ pip wheel --wheel-dir=/local/wheels pkg
登入後複製

下面进入正题:setup.py

1. 超详细讲解 setup.py 的编写

打包分发最关键的一步是编写 setup.py 文件。

以下是一个 setup.py 简单的使用示例

from setuptools import setup, find_packages
  setup(            
     name="mytest",     
     version="1.0",     
     author="name",     
     author_email="name@163.com",    
     # 项目地址 
     url="https://github.com/test/mytest",
     description="Learn to Pack Python Module",             
     # 你要安装的包,通过 setuptools.find_packages 自动发现当前目录下有哪些包     
     packages=find_packages()
)
登入後複製

接下来,我将慢慢扩充这个setup函数,增加更多的参数,以便你能理解setup函数能做哪些事情。

关于安装环境的限制

有些库并不是在所有的 Python 版本中都适用的,若一个库安装在一个未兼容的 Python 环境中,理论上不应该在使用时才报错,而应该在安装过程就使其失败,提示禁止安装。

这可以使用 python_requires 来实现。

setup(     
    ...     
    python_requires=&#39;>=2.7, <=3&#39;, 
)
登入後複製

关于依赖包下载安装

from setuptools import setup, find_packages   
setup(     
    ...      
    # 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装     
    install_requires=[&#39;docutils>=0.3&#39;],      
    # setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置    
    # 这里列出的包,不会自动安装。     
    setup_requires=[&#39;pbr&#39;],      
    # 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。     
    # 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。     
    tests_require=[         
        &#39;pytest>=3.3.1&#39;,         
        &#39;pytest-cov>=2.5.1&#39;,     
    ],      
    # 用于安装setup_requires或tests_require里的软件包     
    # 这些信息会写入egg的 metadata 信息中    
     dependency_links=[         
        "http://example2.com/p/foobar-1.0.tar.gz",     
     ],      
    # install_requires 在安装模块时会自动安装依赖包     
    # 而 extras_require 不会,这里仅表示该模块会依赖这些包     
    # 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装    
     extras_require={        
        &#39;PDF&#39;:  ["ReportLab>=1.2", "RXP"],         
        &#39;reST&#39;: ["docutils>=0.3"],    
     } 
)
登入後複製

关于文件的分发

from setuptools import setup, find_packages   
setup(     
    name="mytest",    
    version="1.0",    
    author="name",    
    author_email="name@163.com",     
    description="Learn to Pack Python Module",     
    url="https://github.com/test/mytest",  
    packages=find_packages(),     
    # 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等     
    data_files=        
        [         
            (&#39;&#39;, [&#39;conf/*.conf&#39;]),         
            (&#39;/usr/lib/systemd/system/&#39;, [&#39;bin/*.service&#39;]),               
        ],     
    # 希望被打包的文件     
    package_data={
        &#39;&#39;:[&#39;*.txt&#39;],         
        &#39;bandwidth_reporter&#39;:[&#39;*.txt&#39;]                
    },     
    # 不打包某些文件    
     exclude_package_data={         
        &#39;bandwidth_reporter&#39;:[&#39;*.txt&#39;]                
    } 
)
登入後複製

关于程序分类信息

classifiers 参数说明包的分类信息。

示例:

from setuptools import setup, find_packages  
setup(     
    classifiers = [         
        # 发展时期,常见的如下         
        #   3 - Alpha         
        #   4 - Beta         
        #   5 - Production/Stable         
        &#39;Development Status :: 3 - Alpha&#39;,          
        # 开发的目标用户         
        &#39;Intended Audience :: Developers&#39;,          
        # 属于什么类型         
        &#39;Topic :: Software Development :: Build Tools&#39;,          
        # 许可证信息         
        &#39;License :: OSI Approved :: MIT License&#39;,          
        # 目标 Python 版本         
        &#39;Programming Language :: Python :: 2&#39;,         
        &#39;Programming Language :: Python :: 2.7&#39;,         
        &#39;Programming Language :: Python :: 3&#39;,         
        &#39;Programming Language :: Python :: 3.3&#39;,         
        &#39;Programming Language :: Python :: 3.4&#39;,         
        &#39;Programming Language :: Python :: 3.5&#39;,     
    ] 
)
登入後複製

2.生成可执行文件的分发

from setuptools import setup, find_packages   
setup(     
    ...   
    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/foo 的可执行文件     
    # 该文件入口指向 foo/main.py 的main 函数     
    entry_points={         
        &#39;console_scripts&#39;: [             
            &#39;foo = foo.main:main&#39;         
        ]     
    },      
    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中     
    # 执行 python setup.py install 后会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py     
    scripts=[&#39;bin/foo.sh&#39;, &#39;bar.py&#39;]
)
登入後複製

上面的 scripts 里有的脚本中有 sh 和 py 后缀,那么安装后,setuptools 会原封不动的移动到 /usr/bin 中,并添加可执行权限。

指定release

setup.py 里只能指定 version,而不能指定 release,如果你需要变更版本号,可以使用 --release 参数进行指定

python setup.py bdist_rpm --release=20200617
登入後複製

setup.py 的参数非常多,能够不借助文档写好一个setup.py好像没那么简单。为了备忘,我整理了 setup 函数常用的一些参数:

如何使用Python中的setup.py檔?

3. 如何使用 setup.py 构建包

a、构建源码发布包。

用于发布一个 Python 模块或项目,将源码打包成 tar.gz (用于 Linux 环境中)或者 zip 压缩包(用于 Windows 环境中)

$ python setup.py sdist
登入後複製

那这种包如何安装呢?

答案是,使用下一节即将介绍的 setuptools 中提供的 easy_install 工具。

$ easy_install xxx.tar.gz
登入後複製

使用 sdist 将根据当前平台创建默认格式的存档。在类 Unix 平台上,将创建后缀后为 .tar.gz 的 gzip 压缩的tar文件分发包,而在Windows上为 ZIP 文件。

当然,你也可以通过指定你要的发布包格式来打破这个默认行为

$ python setup.py sdist --formats=gztar,zip
登入後複製

你可以指定的格式有哪些呢?

创建一个压缩的tarball和一个zip文件。可用格式为:

如何使用Python中的setup.py檔?

对以上的格式,有几点需要注意一下:

  • 在版本3.5中才添加了对 xztar 格式的支持

  • zip 格式需要你事先已安装相应的模块:zip程序或zipfile模块(已成为Python的标准库)

  • ztar 格式正在弃用,请尽量不要使用

另外,如果您希望归档文件的所有文件归root拥有,可以这样指定

python setup.py sdist --owner=root --group=root
登入後複製

b、构建二进制分发包。

在windows中我们习惯了双击 exe 进行软件的安装,Python 模块的安装也同样支持 打包成 exe 这样的二进制软件包。

$ python setup.py bdist_wininst
登入後複製

而在 Linux 中,大家也习惯了使用 rpm 来安装包,对此你可以使用这条命令实现 rpm 包的构建

$ python setup.py bdist_rpm
登入後複製

若你喜欢使用 easy_install 或者 pip 来安装离线包。你可以将其打包成 egg 包

$ python setup.py bdist_egg
登入後複製

若你的项目,需要安装多个平台下,既有 Windows 也有 Linux,按照上面的方法,多种格式我们要执行多次命令,为了方便,你可以一步到位,执行如下这条命令,即可生成多个格式的进制包

$ python setup.py bdist
登入後複製

4. 如何使用 setup.py 安装包

正常情况下,我们都是通过以上构建的源码包或者二进制包进行模块的安装。

但在编写 setup.py 的过程中,可能不能一步到位,需要多次调试,这时候如何测试自己写的 setup.py 文件是可用的呢?

这时候你可以使用python setup.py install命令,它会将你的模块安装至系统全局环境中.

如若你的项目还处于开发阶段,频繁的安装模块,也是一个麻烦事。

这时候你可以使用这条命令安装,该方法不会真正的安装包,而是在系统环境中创建一个软链接指向包实际所在目录。这边在修改包之后不用再安装就能生效,便于调试。

$ python setup.py develop
登入後複製

5. 如何发布包到 PyPi?

通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要 share 给其他人使用,你可以将其上传到 PyPi (Python Package Index)上,它是 Python 官方维护的第三方包仓库,用于统一存储和管理开发者发布的 Python 包。

如果要发布自己的包,需要先到 pypi 上注册账号。然后创建 ~/.pypirc 文件,此文件中配置 PyPI 访问地址和账号。如的.pypirc文件内容请根据自己的账号来修改。

典型的 .pypirc 文件

[distutils] 
index-servers = pypi  
[pypi] 
username:xxx password:xxx
登入後複製

然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。

$ python setup.py register
登入後複製

注册完了后,你还要上传源码包,别人才使用下载安装

$ python setup.py upload
登入後複製

以上是如何使用Python中的setup.py檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HadiDB:Python 中的輕量級、可水平擴展的數據庫 HadiDB:Python 中的輕量級、可水平擴展的數據庫 Apr 08, 2025 pm 06:12 PM

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序 Python:探索其主要應用程序 Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 Apr 09, 2025 pm 03:09 PM

作為數據專業人員,您需要處理來自各種來源的大量數據。這可能會給數據管理和分析帶來挑戰。幸運的是,兩項 AWS 服務可以提供幫助:AWS Glue 和 Amazon Athena。

redis怎麼啟動服務器 redis怎麼啟動服務器 Apr 10, 2025 pm 08:12 PM

啟動 Redis 服務器的步驟包括:根據操作系統安裝 Redis。通過 redis-server(Linux/macOS)或 redis-server.exe(Windows)啟動 Redis 服務。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令檢查服務狀態。使用 Redis 客戶端,如 redis-cli、Python 或 Node.js,訪問服務器。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

See all articles