<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          花了兩天,終于把 Python 的 setup.py 給整明白了

          共 17833字,需瀏覽 36分鐘

           ·

          2021-02-04 18:17


          ↑ 關(guān)注 + 星標(biāo) ,每天學(xué)Python新技能

          后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包

          來(lái)源:Python編程時(shí)光
          作者:寫代碼的明哥

          1. 為什么需要對(duì)項(xiàng)目分發(fā)打包?

          平常我們習(xí)慣了使用 pip 來(lái)安裝一些第三方模塊,這個(gè)安裝過(guò)程之所以簡(jiǎn)單,是因?yàn)槟K開發(fā)者為我們默默地為我們做了所有繁雜的工作,而這個(gè)過(guò)程就是 打包。

          打包,就是將你的源代碼進(jìn)一步封裝,并且將所有的項(xiàng)目部署工作都事先安排好,這樣使用者拿到后即裝即用,不用再操心如何部署的問(wèn)題(如果你不想對(duì)照著一堆部署文檔手工操作的話)。

          不管你是在工作中,還是業(yè)余準(zhǔn)備自己寫一個(gè)可以上傳到 PyPI 的項(xiàng)目,你都要學(xué)會(huì)如何打包你的項(xiàng)目。

          Python 發(fā)展了這么些年了,項(xiàng)目打包工具也已經(jīng)很成熟了。他們都有哪些呢?

          你可能聽過(guò) disutils、 distutils 、distutils2setuptools等等,好像很熟悉,卻又很陌生,他們都是什么關(guān)系呢?

          2. 包分發(fā)的始祖:distutils

          distutils 是 Python 的一個(gè)標(biāo)準(zhǔn)庫(kù),從命名上很容易看出它是一個(gè)分發(fā)(distribute)工具(utlis),它是 Python 官方開發(fā)的一個(gè)分發(fā)打包工具,所有后續(xù)的打包工具,全部都是基于它進(jìn)行開發(fā)的。

          distutils 的精髓在于編寫 setup.py,它是模塊分發(fā)與安裝的指導(dǎo)文件。

          那么如何編寫 setup.py 呢?這里面的內(nèi)容非常多,我會(huì)在后面進(jìn)行詳細(xì)的解析,請(qǐng)你耐心往下看。

          你有可能沒寫過(guò) setup.py ,但你絕對(duì)使用過(guò) setup.py 來(lái)做一些事情,比如下面這條命令,我們經(jīng)常用它來(lái)進(jìn)行模塊的安裝。

          $ python setup.py install

          這樣的安裝方法是通過(guò)源碼安裝,與之對(duì)應(yīng)的是通過(guò)二進(jìn)制軟件包的安裝,同樣我也會(huì)在后面進(jìn)行介紹。

          3. 分發(fā)工具升級(jí):setuptools

          setuptools 是 distutils 增強(qiáng)版,不包括在標(biāo)準(zhǔn)庫(kù)中。其擴(kuò)展了很多功能,能夠幫助開發(fā)者更好的創(chuàng)建和分發(fā) Python 包。大部分 Python 用戶都會(huì)使用更先進(jìn)的 setuptools 模塊。

          distribute,或許你在其他地方也見過(guò)它,這里也提一下。

          distribute 是 setuptools 有一個(gè)分支版本,分支的原因可能是有一部分開發(fā)者認(rèn)為 setuptools 開發(fā)太慢了。但現(xiàn)在,distribute 又合并回了 setuptools 中。因此,我們可以認(rèn)為它們是同一個(gè)東西。

          還有一個(gè)大包分發(fā)工具是 distutils2,其試圖嘗試充分利用distutils,detuptools 和 distribute 并成為 Python 標(biāo)準(zhǔn)庫(kù)中的標(biāo)準(zhǔn)工具。但該計(jì)劃并沒有達(dá)到預(yù)期的目的,且已經(jīng)是一個(gè)廢棄的項(xiàng)目。

          因此,setuptools 是一個(gè)優(yōu)秀的,可靠的 Python 包安裝與分發(fā)工具。

          那么如何在一個(gè)干凈的環(huán)境中安裝 setuptools 呢?

          主要有兩種方法:

          • 源碼安裝:在 https://pypi.org/project/setuptools/#files 中下載 zip 包 解壓執(zhí)行 python setup.py install 安裝

          • 通過(guò)引導(dǎo)程序安裝:下載引導(dǎo)程序,它可以用來(lái)下載或者更新最新版本的 setuptools

          $ wget http://peak.telecommunity.com/dist/ez_setup.py

          #
           安裝
          $ python ez_setup.py

          #
           更新,以下兩種任選
          $ python ez_setup.py –U setuptools
          $ pip install -U setuptools

          4. easy_install 使用指南

          當(dāng)你安裝完 setuptools 后,就擁有了一個(gè)叫做 easy_install 的第三方管理工具,這也是它區(qū)分于 distutils 的一大改進(jìn)。

          這里簡(jiǎn)單介紹一下它的用法,雖然它已經(jīng)用得非常少了。

          先是包的安裝

          # 通過(guò)包名,從PyPI尋找最新版本,自動(dòng)下載、編譯、安裝
          $ easy_install pkg_name

          #
           通過(guò)包名從指定下載頁(yè)尋找鏈接來(lái)安裝或升級(jí)包
          $ 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

          #
           在安裝時(shí)你可以添加額外的參數(shù)
          指定安裝目錄:--install-dir=DIR, -d DIR
          指定用戶安裝:--user

          再者是包的升級(jí)

          # 從 pypi 中搜索并升級(jí)包
          $ easy_install --upgrade pkg_name

          #
           指定版本進(jìn)行升級(jí)
          $ easy_install "SomePackage==2.0"

          最后是包的刪除

          $ easy_install -m pkg_name

          需要注意的是,這樣的刪除,僅是在 easy-install.pth 文件中刪除,使其不能在 python 中使用 這個(gè)模塊,但實(shí)際的包還在你的電腦中,若要?jiǎng)h除徹底,需要你手動(dòng)刪除相關(guān)的 .egg 及 其他文件。

          默認(rèn)情況下,easy_install 只會(huì)從 pypi 上下載相關(guān)軟件包,由于這個(gè)源在國(guó)外,下載包的速度并不理想,使用過(guò)pip的朋友自然會(huì)想,easy_install 是否能指定源進(jìn)行安裝呢?

          答案是,可以的。

          編輯配置文件 /root/.pydistutils.cfg

          [easy_install]
          index-url=http://mirrors.aliyun.com/pypi/simple/
          find-links=http://mirrors.aliyun.com/pypi/simple/

          以上僅介紹了 easy_install 的一些常用的方法,想要了解更多,你可以點(diǎn)擊官方文檔:https://setuptools.readthedocs.io/en/latest/easy_install.html

          總結(jié)一句:setuptools 是官方提供的一個(gè)專業(yè)用于包分發(fā)的工具,若只從安裝的角度來(lái)看,它的功能確實(shí)簡(jiǎn)單。它更大的意義是對(duì)包的分發(fā)很有用,定制化程序非常高,我們現(xiàn)在也還在用它進(jìn)行版本包的發(fā)布。

          5. 源碼包與二進(jìn)制包什么區(qū)別?

          Python 包的分發(fā)可以分為兩種:

          1. 以源碼包的方式發(fā)布

          源碼包安裝的過(guò)程,是先解壓,再編譯,最后才安裝,所以它是跨平臺(tái)的,由于每次安裝都要進(jìn)行編譯,相對(duì)二進(jìn)包安裝方式來(lái)說(shuō)安裝速度較慢。

          源碼包的本質(zhì)是一個(gè)壓縮包,其常見的格式有:

          1. 以二進(jìn)制包形式發(fā)布

          二進(jìn)制包的安裝過(guò)程省去了編譯的過(guò)程,直接進(jìn)行解壓安裝,所以安裝速度較源碼包來(lái)說(shuō)更快。

          由于不同平臺(tái)的編譯出來(lái)的包無(wú)法通用,所以在發(fā)布時(shí),需事先編譯好多個(gè)平臺(tái)的包。

          二進(jìn)制包的常見格式有:

          6. eggs 與 wheels 有什么區(qū)別?

          Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定義。Wheel 的出現(xiàn)是為了替代 Egg,它的本質(zhì)是一個(gè)zip包,其現(xiàn)在被認(rèn)為是 Python 的二進(jìn)制包的標(biāo)準(zhǔn)格式。

          以下是 Wheel 和 Egg 的主要區(qū)別:

          • Wheel 有一個(gè)官方的 PEP427 來(lái)定義,而 Egg 沒有 PEP 定義

          • Wheel 是一種分發(fā)格式,即打包格式。而 Egg 既是一種分發(fā)格式,也是一種運(yùn)行時(shí)安裝的格式,并且是可以被直接 import

          • Wheel 文件不會(huì)包含 .pyc 文件

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

          • Wheel 有著更豐富的命名規(guī)則。

          • Wheel 是有版本的。每個(gè) Wheel 文件都包含 wheel 規(guī)范的版本和打包的實(shí)現(xiàn)

          • Wheel 在內(nèi)部被 sysconfig path type 管理,因此轉(zhuǎn)向其他格式也更容易

          wheel 包可以通過(guò) pip 來(lái)安裝,只不過(guò)需要先安裝 wheel 模塊,然后再使用 pip 的命令。

          $ pip install wheel
          $ pip wheel --wheel-dir=/local/wheels pkg

          7. 超詳細(xì)講解 setup.py 的編寫?

          打包分發(fā)最關(guān)鍵的一步是編寫 setup.py 文件。

          以下是一個(gè) setup.py 簡(jiǎn)單的使用示例

          from setuptools import setup, find_packages

          setup(
              name="mytest",
              version="1.0",
              author="wangbm",
              author_email="[email protected]",
              description="Learn to Pack Python Module  -->公眾號(hào):Python編程時(shí)光",

              # 項(xiàng)目主頁(yè)
              url="http://iswbm.com/"

              # 你要安裝的包,通過(guò) setuptools.find_packages 找到當(dāng)前目錄下有哪些包
              packages=find_packages()
          )

          接下來(lái),我將慢慢擴(kuò)充這個(gè)setup函數(shù),增加更多的參數(shù),以便你能理解setup函數(shù)能做哪些事情。

          程序分類信息

          classifiers 參數(shù)說(shuō)明包的分類信息。所有支持的分類列表見:https://pypi.org/pypi?%3Aaction=list_classifiers

          示例:

          from setuptools import setup, find_packages

          setup(
              classifiers = [
                  # 發(fā)展時(shí)期,常見的如下
                  #   3 - Alpha
                  #   4 - Beta
                  #   5 - Production/Stable
                  'Development Status :: 3 - Alpha',

                  # 開發(fā)的目標(biāo)用戶
                  'Intended Audience :: Developers',

                  # 屬于什么類型
                  'Topic :: Software Development :: Build Tools',

                  # 許可證信息
                  'License :: OSI Approved :: MIT License',

                  # 目標(biāo) Python 版本
                  'Programming Language :: Python :: 2',
                  'Programming Language :: Python :: 2.7',
                  'Programming Language :: Python :: 3',
                  'Programming Language :: Python :: 3.3',
                  'Programming Language :: Python :: 3.4',
                  'Programming Language :: Python :: 3.5',
              ]
          )

          關(guān)于文件的分發(fā)

          from setuptools import setup, find_packages


          setup(
              name="mytest",
              version="1.0",
              author="wangbm",
              author_email="[email protected]",
              description="Learn to Pack Python Module",
              url="http://iswbm.com/"
              packages=find_packages(),

              # 安裝過(guò)程中,需要安裝的靜態(tài)文件,如配置文件、service文件、圖片等
              data_files=[
                  ('', ['conf/*.conf']),
                  ('/usr/lib/systemd/system/', ['bin/*.service']),
                         ],

              # 希望被打包的文件
              package_data={
                  '':['*.txt'],
                  'bandwidth_reporter':['*.txt']
                         },
              # 不打包某些文件
              exclude_package_data={
                  'bandwidth_reporter':['*.txt']
                         }
          )

          除了以上的參數(shù)配置之外,還可以使用一個(gè)叫做 MANIFEST.in 的文件,來(lái)控制文件的分發(fā)。

          如下這是一個(gè) MANIFEST.in 的樣例:

          include *.txt
          recursive-include examples *.txt *.py
          prune examples/sample?/build

          這些配置,規(guī)定了如下幾點(diǎn)

          • 所有根目錄下的以 txt 為后綴名的文件,都會(huì)分發(fā)

          • 根目錄下的 examples 目錄 和 txt、py文件都會(huì)分發(fā)

          • 路徑匹配上 examples/sample?/build 不會(huì)分發(fā)

          MANIFEST.in 需要放在和 setup.py 同級(jí)的頂級(jí)目錄下,setuptools 會(huì)自動(dòng)讀取該文件。

          關(guān)于依賴包下載安裝

          from setuptools import setup, find_packages


          setup(
              ...

              # 表明當(dāng)前模塊依賴哪些包,若環(huán)境中沒有,則會(huì)從pypi中下載安裝
              install_requires=['docutils>=0.3'],

              # setup.py 本身要依賴的包,這通常是為一些setuptools的插件準(zhǔn)備的配置
              # 這里列出的包,不會(huì)自動(dòng)安裝。
              setup_requires=['pbr'],

              # 僅在測(cè)試時(shí)需要使用的依賴,在正常發(fā)布的代碼中是沒有用的。
              # 在執(zhí)行python setup.py test時(shí),可以自動(dòng)安裝這三個(gè)庫(kù),確保測(cè)試的正常運(yùn)行。
              tests_require=[
                  'pytest>=3.3.1',
                  'pytest-cov>=2.5.1',
              ],

              # 用于安裝setup_requires或tests_require里的軟件包
              # 這些信息會(huì)寫入egg的 metadata 信息中
              dependency_links=[
                  "http://example2.com/p/foobar-1.0.tar.gz",
              ],

              # install_requires 在安裝模塊時(shí)會(huì)自動(dòng)安裝依賴包
              # 而 extras_require 不會(huì),這里僅表示該模塊會(huì)依賴這些包
              # 但是這些包通常不會(huì)使用到,只有當(dāng)你深度使用模塊時(shí),才會(huì)用到,這里需要你手動(dòng)安裝
              extras_require={
                  'PDF':  ["ReportLab>=1.2""RXP"],
                  'reST': ["docutils>=0.3"],
              }
          )

          關(guān)于 install_requires, 有以下五種常用的表示方法:

          1. 'argparse',只包含包名。這種形式只檢查包的存在性,不檢查版本。方便,但不利于控制風(fēng)險(xiǎn)。

          2. 'setuptools==38.2.4',指定版本。這種形式把風(fēng)險(xiǎn)降到了最低,確保了開發(fā)、測(cè)試與部署的版本一致,不會(huì)出現(xiàn)意外。缺點(diǎn)是不利于更新,每次更新都需要改動(dòng)代碼。

          3. 'docutils >= 0.3',這是比較常用的形式。當(dāng)對(duì)某個(gè)庫(kù)比較信任時(shí),這種形式可以自動(dòng)保持版本為最新。

          4. 'Django &gt;= 1.11, != 1.11.1, <= 2',這是比較復(fù)雜的形式。如這個(gè)例子,保證了Django的大版本在1.11和2之間,也即1.11.x;并且,排除了已知有問(wèn)題的版本1.11.1(僅舉例)。對(duì)于一些大型、復(fù)雜的庫(kù),這種形式是最合適的。

          5. 'requests[security, socks] >= 2.18.4',這是包含了額外的可選依賴的形式。正常安裝requests會(huì)自動(dòng)安裝它的install_requires中指定的依賴,而不會(huì)安裝securitysocks這兩組依賴。這兩組依賴是定義在它的extras_require中。這種形式,用在深度使用某些庫(kù)時(shí)。

          關(guān)于安裝環(huán)境的限制

          有些庫(kù)并不是在所以的 Python 版本中都適用的,若一個(gè)庫(kù)安裝在一個(gè)未兼容的 Python 環(huán)境中,理論上不應(yīng)該在使用時(shí)才報(bào)錯(cuò),而應(yīng)該在安裝過(guò)程就使其失敗,提示禁止安裝。

          這樣的功能,可以使用 python_requires 來(lái)實(shí)現(xiàn)。

          setup(
              ...
              python_requires='>=2.7, <=3',
          )

          生成可執(zhí)行文件的分發(fā)

          from setuptools import setup, find_packages


          setup(
              name="mytest",
              version="1.0",
              author="wangbm",
              author_email="[email protected]",
              description="Learn to Pack Python Module",
              url="http://iswbm.com/"
              packages=find_packages(),

              # 用來(lái)支持自動(dòng)生成腳本,安裝后會(huì)自動(dòng)生成 /usr/bin/foo 的可執(zhí)行文件
              # 該文件入口指向 foo/main.py 的main 函數(shù)
              entry_points={
                  'console_scripts': [
                      'foo = foo.main:main'
                  ]
              },

              # 將 bin/foo.sh 和 bar.py 腳本,生成到系統(tǒng) PATH中
              # 執(zhí)行 python setup.py install 后
              # 會(huì)生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py
              scripts=['bin/foo.sh''bar.py']
          )

          上面的 scripts 里有的腳本中有 shpy 后綴,那么安裝后,setuptools 會(huì)原封不動(dòng)的移動(dòng)到 /usr/bin 中,并添加可執(zhí)行權(quán)限。

          若你想對(duì)這些文件再作一些更改,比如去掉多余的后綴,可以這樣做

          from setuptools.command.install_scripts import install_scripts

          class InstallScripts(install_scripts):

              def run(self):
                  setuptools.command.install_scripts.install_scripts.run(self)

                  # Rename some script files
                  for script in self.get_outputs():
                      if basename.endswith(".py"or basename.endswith(".sh"):
                          dest = script[:-3]
                      else:
                          continue
                      print("moving %s to %s" % (script, dest))
                      shutil.move(script, dest)

          setup(
              ...
              scripts=['bin/foo.sh''bar.py'],

              cmdclass={
                  "install_scripts": InstallScripts
              }
          )

          ext_modules

          ext_modules 參數(shù)用于構(gòu)建 C 和 C++ 擴(kuò)展擴(kuò)展包。其是 Extension 實(shí)例的列表,每一個(gè) Extension 實(shí)例描述了一個(gè)獨(dú)立的擴(kuò)展模塊,擴(kuò)展模塊可以設(shè)置擴(kuò)展包名,頭文件、源文件、鏈接庫(kù)及其路徑、宏定義和編輯參數(shù)等。如:

          setup(
              # other arguments here...
              ext_modules=[
                  Extension('foo',
                            glob(path.join(here, 'src''*.c')),
                            libraries = [ 'rt' ],
                            include_dirs=[numpy.get_include()])
              ]
          )

          詳細(xì)了解可參考:https://docs.python.org/3.6/distutils/setupscript.html#preprocessor-options

          指定release

          setup.py 里只能指定 version,而不能指定 release,如果你需要變更版本號(hào),可以使用 --release 參數(shù)進(jìn)行指定

          python setup.py bdist_rpm --release=20200617

          setup.py 的參數(shù)非常多,能夠不借助文檔寫好一個(gè)setup.py好像沒那么簡(jiǎn)單。為了備忘,我整理了 setup 函數(shù)常用的一些參數(shù):

          更多參數(shù)可見:https://setuptools.readthedocs.io/en/latest/setuptools.html

          8. 打包輔助神器PBR 是什么?

          pbr 是 setuptools 的輔助工具,最初是為 OpenStack 開發(fā)(https://launchpad.net/pbr),基于d2to1。

          pbr 會(huì)讀取和過(guò)濾setup.cfg中的數(shù)據(jù),然后將解析后的數(shù)據(jù)提供給 setup.py 作為參數(shù)。包含如下功能:

          1. 從git中獲取Version、AUTHORS and ChangeLog信息

          2. Sphinx Autodoc。pbr 會(huì)掃描project,找到所有模塊,生成stub files

          3. Requirements。pbr會(huì)讀取requirements.txt,生成setup函數(shù)需要的install_requires/tests_require/dependency_links

          這里需要注意,在 requirements.txt 文件的頭部可以使用:--index https://pypi.python.org/simple/,這一行把一個(gè)抽象的依賴聲明如 requests==1.2.0 轉(zhuǎn)變?yōu)橐粋€(gè)具體的依賴聲明 requests 1.2.0 from pypi.python.org/simple/

          1. long_description。從README.rst, README.txt or README file中生成long_description參數(shù)

          使用pbr很簡(jiǎn)單:

          from setuptools import setup

          setup(
              setup_requires=['pbr'],
              pbr=True,
          )

          使用pbr時(shí),setup.cfg中有一些配置。在[files]中,有三個(gè)key:
          packages:指定需要包含的包,行為類似于setuptools.find_packages
          namespace_packages:指定namespace packages
          data_files: 指定目的目錄和源文件路徑,一個(gè)示例:

          [files]
          data_files =
              etc/pbr = etc/pbr/*
              etc/neutron =
                  etc/api-paste.ini
                  etc/dhcp-agent.ini
              etc/init.d = neutron.init

          [entry_points] 段跟 setuptools 的方式相同。

          到此,我講了三種編寫使用 setup.py 的方法

          • 使用命令行參數(shù)指定,一個(gè)一個(gè)將參數(shù)傳遞進(jìn)去(極不推薦)

          • 在 setup.py 中的setup函數(shù)中指定(推薦使用)

          • 使用 pbr ,在 setup.cfg 中指定(易于管理,更推薦)

          9. 如何使用 setup.py 構(gòu)建包

          1、構(gòu)建源碼發(fā)布包。

          用于發(fā)布一個(gè) Python 模塊或項(xiàng)目,將源碼打包成 tar.gz (用于 Linux 環(huán)境中)或者 zip 壓縮包(用于 Windows 環(huán)境中)

          $ python setup.py sdist

          那這種包如何安裝呢?

          答案是,使用下一節(jié)即將介紹的 setuptools 中提供的 easy_install 工具。

          $ easy_install xxx.tar.gz

          使用 sdist 將根據(jù)當(dāng)前平臺(tái)創(chuàng)建默認(rèn)格式的存檔。在類 Unix 平臺(tái)上,將創(chuàng)建后綴后為 .tar.gz  的 gzip 壓縮的tar文件分發(fā)包,而在Windows上為 ZIP 文件。

          當(dāng)然,你也可以通過(guò)指定你要的發(fā)布包格式來(lái)打破這個(gè)默認(rèn)行為

          $ python setup.py sdist --formats=gztar,zip

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

          創(chuàng)建一個(gè)壓縮的tarball和一個(gè)zip文件??捎酶袷綖椋?/p>

          對(duì)以上的格式,有幾點(diǎn)需要注意一下:

          • 在版本3.5中才添加了對(duì)  xztar 格式的支持

          • zip 格式需要你事先已安裝相應(yīng)的模塊:zip程序或zipfile模塊(已成為Python的標(biāo)準(zhǔn)庫(kù))

          • ztar 格式正在棄用,請(qǐng)盡量不要使用

          另外,如果您希望歸檔文件的所有文件歸root擁有,可以這樣指定

          python setup.py sdist --owner=root --group=root

          2、構(gòu)建二進(jìn)制分發(fā)包。

          在windows中我們習(xí)慣了雙擊 exe 進(jìn)行軟件的安裝,Python 模塊的安裝也同樣支持 打包成 exe 這樣的二進(jìn)制軟件包。

          $ python setup.py bdist_wininst

          而在 Linux 中,大家也習(xí)慣了使用 rpm 來(lái)安裝包,對(duì)此你可以使用這條命令實(shí)現(xiàn) rpm 包的構(gòu)建

          $ python setup.py bdist_rpm

          若你喜歡使用 easy_install 或者 pip 來(lái)安裝離線包。你可以將其打包成 egg 包

          $ python setup.py bdist_egg

          若你的項(xiàng)目,需要安裝多個(gè)平臺(tái)下,既有 Windows 也有 Linux,按照上面的方法,多種格式我們要執(zhí)行多次命令,為了方便,你可以一步到位,執(zhí)行如下這條命令,即可生成多個(gè)格式的進(jìn)制包

          $ python setup.py bdist

          10. 如何使用 setup.py 安裝包

          正常情況下,我們都是通過(guò)以上構(gòu)建的源碼包或者二進(jìn)制包進(jìn)行模塊的安裝。

          但在編寫 setup.py 的過(guò)程中,可能不能一步到位,需要多次調(diào)試,這時(shí)候如何測(cè)試自己寫的 setup.py 文件是可用的呢?

          這時(shí)候你可以使用這條命令,它會(huì)將你的模塊安裝至系統(tǒng)全局環(huán)境中

          $ python setup.py install

          如若你的項(xiàng)目還處于開發(fā)階段,頻繁的安裝模塊,也是一個(gè)麻煩事。

          這時(shí)候你可以使用這條命令安裝,該方法不會(huì)真正的安裝包,而是在系統(tǒng)環(huán)境中創(chuàng)建一個(gè)軟鏈接指向包實(shí)際所在目錄。這邊在修改包之后不用再安裝就能生效,便于調(diào)試。

          $ python setup.py develop

          11. 如何發(fā)布包到 PyPi?

          通過(guò)上面的學(xué)習(xí),你一定已經(jīng)學(xué)會(huì)了如何打包自己的項(xiàng)目,若你覺得自己開發(fā)的模塊非常不錯(cuò),想要 share 給其他人使用,你可以將其上傳到 PyPi (Python Package Index)上,它是 Python 官方維護(hù)的第三方包倉(cāng)庫(kù),用于統(tǒng)一存儲(chǔ)和管理開發(fā)者發(fā)布的 Python 包。

          如果要發(fā)布自己的包,需要先到 pypi 上注冊(cè)賬號(hào)。然后創(chuàng)建 ~/.pypirc 文件,此文件中配置 PyPI 訪問(wèn)地址和賬號(hào)。如的.pypirc文件內(nèi)容請(qǐng)根據(jù)自己的賬號(hào)來(lái)修改。

          典型的 .pypirc 文件

          [distutils]
          index-servers = pypi

          [pypi]

          username:xxx
          password:xxx

          然后使用這條命令進(jìn)行信息注冊(cè),完成后,你可以在 PyPi 上看到項(xiàng)目信息。

          $ python setup.py register

          注冊(cè)完了后,你還要上傳源碼包,別人才使用下載安裝

          $ python setup.py upload

          或者也可以使用 twine 工具注冊(cè)上傳,它是一個(gè)專門用于與 pypi 進(jìn)行交互的工具,詳情可以參考官網(wǎng):https://www.ctolib.com/twine.html,這里不詳細(xì)講了。

          參考文章

          • http://blog.konghy.cn/2018/04/29/setup-dot-py/

          • https://note.qidong.name/2018/01/python-setup-requires/

          見面禮


          碼加我微信備注「三劍客」送你上圖三本Python入門電子書 


          推薦閱讀


          1. 我為什么拋棄Windows,入坑MacBook

          2. 自學(xué)Python3年,我終于做了這個(gè)決定....

          3. 95后程序員月薪2萬(wàn)背著電腦送外賣,送單途中改Bug

          點(diǎn)分享
          點(diǎn)收藏
          點(diǎn)點(diǎn)贊
          點(diǎn)在看
          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产亲子乱婬一级A片借种 | 三级片人人网址 | 丁香五月激情啪啪啪 | 亚欧综合视频在线 | 国产乱码一区二区三区的解决方法 |