python项目打包发布总结

2023-05-16

概览

这里主要收集python项目的打包、发布和部署的常用方法,只是入门级别,深入的流程还是以官方文档为准(链接每节都已经给出)。

  • distutils,setuptools,pip,virtualenv
  • 官网资料(Python Packaging User Guide):
    https://packaging.python.org/key_projects/#setuptools

简介

  1. distutils - Python自带的基本安装工具, 适用于非常简单的应用场景使用, 不支持依赖包的安装
      通过distutils来打包,生成安装包,安装python包等工作,需要编写名为setup.py python脚本文件。

  2. setuptools - 针对 distutils 做了大量扩展, 尤其是加入了包依赖机制。不支持python3,安装完setuptools后会有easy_install

  3. distribute - 类似于setuptools,支持python3,安装完distribute后会有easy_install。

  4. easy_install - setuptools 和 distribute 自带的安装脚本, 也就是一旦setuptools或distribute安装完毕, easy_install 也便可用了。

  5. pip - 目标是取代easy_install。easy_install 有很多不足: 安装事务是非原子操作, 只支持 svn, 没有提供卸载命令, 安装一系列包时需要写脚本; pip 解决了以上问题, 已俨然成为新的事实标准, virtualenv 与它已经成为一对好搭档;

  6. distutils2 - setuptools 和 distribute 的诞生是因为 distutils 的不济, 进而导致目前分化的状况。它将成为 Python 3.3 的标准库 packaging , 并在其它版本中以distutils2 的身份出现; 换句话说, 它和 pip 将联手结束目前混乱的状况。

  7. virtualenv - 用来创建隔离的python环境,处理python环境的多版本和模块依赖。

  8. 常识
    • sudo apt-get install 安装的package存放在 /usr/lib/python2.7/dist-packages目录中
    • pip 或者 easy_install安装的package存放在/usr/local/lib/python2.7/dist-packages目录中
    • 手动从源代码安装的package存放在site-packages目录中

一、distutils

  1. 新建文件夹(例如:distribution), 将项目文件放进去
  2. 在该文件夹下,新建setup.py文件

    • 编辑内容:

      from distutils.core import setup
      setup(
      name=’logIn’, #这个是最终打包的文件名
      version=’1.0.0’,
      py_modules=[‘logInr’], #要打包哪些,.py文件,
      )

    • 保存退出
  3. 在命令行下,进入该文件夹,运行一下命令:

    • (1). 打包:python setup.py sdist
      这样在文件夹中就多出了几个文件,在dist文件夹中的,logIn-1.0.0.tar.gz就是我们的发布包了;
    • (2). 安装包到本地副本中(路径为:/usr/local/lib/python2.7/dist-packages):
      sudo python setup.py install (–record files.txt)
      注意:为了方便卸载,可以添加括号中的选项(当前文件夹会产生files.txt), 卸载时就可以在当前文件夹下使用如下命令:
      sudo cat files.txt | sudo xargs rm -rf

二、setuptools:

  1. setuptools 只是对distutils 的增强, 其使用过程还是一样:

    编辑: 先在项目主目录下编辑setup.py,
    打包: python setup.py sdist 
    安装: sudo python setup.py install  (--record files.txt)
    卸载: sudo cat files.txt | sudo  xargs rm -rf
    
  2. setuptools工具的setup.py的模板

    • 官方文档(详细): https://setuptools.readthedocs.io/en/latest/setuptools.html#developer-s-guide
    • 中文文档(上手): http://blog.csdn.net/pfm685757/article/details/48651389#t3
    • 模板 (只是一部分, 详见官网说明)

      import ez_setup
      ez.setup.use_setuptools()   # 这两行是当setuptools不存在时,自动从网上下载安装所需的setuptools包.
      from setuptools import setup, find_packages
      setup(
          name = "HelloWorld",
          version = "0.1",
          packages = find_packages(),     # 常用,要熟悉 :会自动查找当前目录下的所有模块(.py文件) 和包(包含__init___.py文件的文件夹)
          scripts = ['say_hello.py'],
          # Project uses reStructuredText, so ensure that the docutils get
          # installed or upgraded on the target machine
          install_requires = ['docutils>=0.3'],       # 常用
          package_data = {
              # If any package contains *.txt or *.rst files, include them:
              '': ['*.txt', '*.rst'],
              # And include any *.msg files found in the 'hello' package, too:
              'hello': ['*.msg'],
          },
          # 
          entry_points = {
              'console_scripts': [
                  'foo = demo:test',
                  'bar = demo:test',
              ],
              'gui_scripts': [
                  'baz = demo:test',
              ]
          },
          # metadata for upload to PyPI
          author = "Me",
          author_email = "me@example.com",
          description = "This is an Example Package",
          license = "PSF",
          keywords = "hello world example examples",
          url = "http://example.com/HelloWorld/",   # project home page, if any
          # could also include long_description, download_url, classifiers, etc.
      )
      

三、virtualenv

  1. 官方文档: https://virtualenv.pypa.io/en/stable/
  2. 主要命令:

        $ virtualenv ENV
        $ virtualenv --system-site-packages ENV   # 继承系统原来的安装包
        $ source bin/activate  # 启动虚拟环境
        $ deactivate       # 退出环境
        $ rm -r /path/to/ENV   # 删除环境
        $ virtualenv --relocatable ENV  #  创造可以浮动的虚拟环境
        $ virtualenv --extra-search-dir=/path/to/distributions ENV # 添加自定义版本的pip或setuptools        
    
  3. 移植:

        创建无继承的虚拟环境
        virtualenv  --no-site-packages  PATH/to/projDirName
    
        进入projDirName, 编辑项目
        cd  PATH/to/projDirName
    
        退出,至上级目录
        cd  ..
        virtualenv --relocatable   projDirName#  创造可以浮动的虚拟环境
    
        将整个文件夹复制到指定的机器上, 进入PATH/to/projDirName, 启动环境,运行程序
    

四 、pip

  • 官方文档: https://pip.pypa.io/en/stable/user_guide/#requirements-files
  • 这里只列出部署相关的两条命令

        pip freeze  > requirements      #  freeze 是导出当前环境安装的安装包
    
        pip install -r requirements.txt         # 这个requirements.txt 有格式要求
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python项目打包发布总结 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐