本节阐述了一个完整的 Python 项目结构,你可以使用什么样的目录布局以及怎样发布软件到网络上。

创建Python项目

我们的实验项目名为 factorial,放到 /home/shiyanlou/factorial 目录:

$ cd /home/shiyanlou
$ mkdir factorial
$ cd factorial/

我们给将要创建的 Python 模块取名为 myfact,因此我们下一步创建 myfact 目录。

$ mkdir myfact
$ cd myfact/

主代码将在 fact.py 文件里面。

"myfact module"

def factorial(num):
"""
返回给定数字的阶乘值 :arg num: 我们将计算其阶乘的整数值 :return: 阶乘值,若传递的参数为负数,则为 -1
"""
if num >= 0:
if num == 0:
return 1
return num * factorial(num -1)
else:
return -1

我们还有模块的 __init__.py 文件,内容如下:

from fact import factorial
__all__ = [factorial, ]

我们还在 factorial 目录下添加了一个 README.rst 文件。因此,目录结构看起来像下面这样:

MANIFEST.in

现在我们要写一个 /home/shiyanlou/factorial/MANIFEST.in 文件,它用来在使用 sdist 命令的时候找出将成为项目源代码压缩包一部分的所有文件。

include *.py
include README.rst

如果你想要排除某些文件,你可以在这个文件中使用 exclude语句。

安装python-setuptools包

$ sudo pip3 install setuptools

setup.py

最终我们需要写一个 /home/shiyanlou/factorial/setup.py,用来创建源代码压缩包或安装软件。

#!/usr/bin/env python3
"""Factorial project"""
from setuptools import find_packages, setup setup(name = 'factorial', # 注意这里的name不要使用factorial相关的名字,因为会重复,需要另外取一个不会与其他人重复的名字
version = '0.1',
description = "Factorial module.",
long_description = "A test module for our book.",
platforms = ["Linux"],
author="ShiYanLou",
author_email="support@shiyanlou.com",
url="https://www.shiyanlou.com/courses/596",
license = "MIT",
packages=find_packages()
)

name 是项目名称,version 是发布版本,description 和 long_description 分别是项目介绍,项目长描述。platforms是此模块的支持平台列表。find_packages() 是一个能在你源目录下找到所有模块的特殊函数,packaging docs

要创建一个源文件发布版本,执行以下命令。

$ python3 setup.py sdist

执行完毕会返回类似下面的信息:

running sdist
running egg_info
creating factorial.egg-info
writing factorial.egg-info/PKG-INFO
writing top-level names to factorial.egg-info/top_level.txt
writing dependency_links to factorial.egg-info/dependency_links.txt
writing manifest file 'factorial.egg-info/SOURCES.txt'
reading manifest file 'factorial.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'factorial.egg-info/SOURCES.txt'
running check
creating factorial-0.1
creating factorial-0.1/factorial.egg-info
creating factorial-0.1/myfact
making hard links in factorial-0.1...
hard linking MANIFEST.in -> factorial-0.1
hard linking README.rst -> factorial-0.1
hard linking setup.py -> factorial-0.1
hard linking factorial.egg-info/PKG-INFO -> factorial-0.1/factorial.egg-info
hard linking factorial.egg-info/SOURCES.txt -> factorial-0.1/factorial.egg-info
hard linking factorial.egg-info/dependency_links.txt -> factorial-0.1/factorial.egg-info
hard linking factorial.egg-info/top_level.txt -> factorial-0.1/factorial.egg-info
hard linking myfact/__init__.py -> factorial-0.1/myfact
hard linking myfact/fact.py -> factorial-0.1/myfact
Writing factorial-0.1/setup.cfg
creating dist
Creating tar archive
removing 'factorial-0.1' (and everything under it)

我们能在 dist 目录下看到一个 tar 压缩包。

$ ls dist/
factorial-0.1.tar.gz

记住尝试安装代码时使用 virtualenv。

执行下面的命令从源代码安装。

$ sudo python3 setup.py install

学习更多可前往 packaging.python.org

Python Package Index(PyPI)

你还记得我们经常使用的 pip 命令吗?有没有想过这些包是从哪里来的?答案是 PyPI。这是 Python 的软件包管理系统。

为了实验,我们会使用 PyPI 的测试服务器 https://testpypi.python.org/pypi

1、创建账号

首先在这个链接注册账号。你会收到带有链接的邮件,点击这个链接确认你的注册。

创建 ~/.pypirc 文件,存放你的账号详细信息,其内容格式如下:

[distutils]
index-servers = pypi
testpypi [pypi]
repository: https://upload.pypi.org/legacy/
username: <username>
password: <password> [testpypi]
repository:https://test.pypi.org/legacy/
username: <username>
password: <password>

替换 <username> 和 <password> 为您新创建的帐户的详细信息。在这里,由于我们是到 testpypi的网页上去注册账号,即将相应的服务上传到 testpypi,所以在这里,你只需修改[testpypi]的用户名和密码

记得在 setup.py 中更改项目的名称为其它的名字来测试下面的指令,在接下来的命令中我将项目名称修改为factorial2,为了不重复,大家需要自行修改至其它名称(不要使用 factorial 和 factorial2,因为已经被使用了),本人用的factorial101。

2、上传到 TestPyPI 服务

下一步我们会将我们的项目到 TestPyPI 服务。这通过 twine 命令完成。

我们也会使用 -r 把它指向测试服务器。

$ sudo pip3 install twine
$ twine upload dist/* -r testpypi

执行完毕会返回类似下面的信息:

Uploading distributions to https://test.pypi.org/legacy/
Uploading factorial101-0.1.tar.gz

现在如果你浏览这个页面,你会发现你的项目已经准备好被别人使用了。

在这里你也可以使用下面的命令上传到 PyPI 服务上,但这里需要注意,在 ~/.pypirc 里面,你需要到 https://pypi.python.org页面,按照上面的步骤去注册一个账号,然后到~/.pypirc 的 [pypi] 下填写相应的用户名和密码。testpypi 和 pypi 的账号密码并不通用。

$ twine upload dist/* -r pypi

参考链接:https://www.shiyanlou.com/courses/596

Python3基础教程(十九)—— 项目结构的更多相关文章

  1. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. Python3基础(十二) 学习总结·附PDF

    Python是一门强大的解释型.面向对象的高级程序设计语言,它优雅.简单.可移植.易扩展,可用于桌面应用.系统编程.数据库编程.网络编程.web开发.图像处理.人工智能.数学应用.文本处理等等. 在学 ...

  3. 无废话ExtJs 入门教程十九[API的使用]

    无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...

  4. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  5. css3基础教程十六变形与动画animation

    前面我们讲过的变形与动画一般都是通过鼠标的单击.获得焦点,被点击或对元素进行一定改变后以后触发效果的,那么有没有像Flash一样自动播放的动画效果呢?答案当然是肯定的,这就是我们今天要讲到的anima ...

  6. ComicEnhancerPro 系列教程十九:用JpegQuality看JPG文件的压缩参数

    作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十九:用JpegQu ...

  7. Python3基础教程(二十)—— flask介绍

    基本概念 什么是Flask? Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 web 应用程序可以是一些 web 页面.博客.w ...

  8. SpringCloud2.0 Zuul 网关路由 基础教程(十)

    1.启动基础工程 1.1.启动[服务注册中心],工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...

  9. Python3基础教程(十八)—— 测试

    编写测试检验应用程序所有不同的功能.每一个测试集中在一个关注点上验证结果是不是期望的.定期执行测试确保应用程序按预期的工作.当测试覆盖很大的时候,通过运行测试你就有自信确保修改点和新增点不会影响应用程 ...

随机推荐

  1. 「网络流24题」「LuoguP4016」 负载平衡问题

    Description GGG 公司有 nnn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nnn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. ...

  2. 数据库sql互转(oracle转mysql为例子)

    转自: https://blog.csdn.net/sinat_32366329/article/details/76402059 在PowerDesinger里找到 File -->> ...

  3. POJ 1737 经典DP

    问题:求含有n个点的连通图的个数. 解: 考虑DP,$f(n)$表示n个点,每个点都和点1相连,且n个点互相连通的图的个数. (蓝字非常重要,这个条件有效地避免了重复计算) $g(n)$表示n个点,每 ...

  4. SPOJ FIBOSUM && FIBOSUM2

    Fibonacci数列定义为 $$f_n = f_{n-1}+f_{n-2}, \text{以及初值}f_0=0, f_1=1.$$ 本文之讨论,皆在模$10^9+7$意义下. FIBOSUM 给定$ ...

  5. A. Meeting of Old Friends

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. Design with the User in Mind--从用户角度进行设计

    Back to Human Interface Design Design with the User in Mind 从用户角度进行设计 The success of a Mac app depen ...

  7. django基础知识

    一.django的安装 1. pip3 install django 2. 把安装路径加到环境变量里以便以后启动admin相关命令,在windows系统中---我的电脑---属性----高级系统设置- ...

  8. Linux 命令 -- tar

    tar 命令 tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现 ...

  9. Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)(转载)

    转自:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html 我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其 ...

  10. byte的范围-128-127

    01111111  表示的是最大的数字 是127这个没有问题  ,前面的0 表示的正数,1表示的负数 而负数在计算机中的存储都是通过补码的形式存在的,也就是说 1 1111 111 是计算机中最小的数 ...