以正确的方式开源 Python 项目(转)

大多数Python开发者至少都写过一个像工具、脚本、库或框架等对其他人也有用的工具。我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛。我不是简单的指——“创建一个GitHub库,提交,在Reddit上发布,每天调用它”。在本文的结尾,你可以把现有的代码转换成一个能够鼓励他人使用和贡献的开源项目。

然而每一个项目都是不同的,但其中将现有代码开源的流程对所有的Python项目都是类似的。在另一个受欢迎的文章系列里我写了“以正确方式开始一个Django项目”,我将概述在开源Python项目我发现的有必要的步骤。

更新 (8月17号): 感谢@pydann提醒我Cookiecutter的存在,@audreyr的一个不起的项目。我在文章结尾添加了其中的一段。看一下Audrey的项目吧!

更新 2 (8月18号):感谢@ChristianHeimes(和其他人)关于ontox这一段。Christian也让我想起了PEP 440和其他一些都已实现很棒的改进建议。

Garfielt
翻译于 2年前

2人顶

 

 翻译的不错哦!

工具和概念

特别是,我发现一些工具和概念十分有用或者说是必要的。下面我就会谈及这方面主题,包括需要运行的精确的命令和需要设置的配置值。其终极目标就是让整个流程简单明了。

  1. 项目布局(目录结构)
  2. setuptools 和 setup.py文件
  3. git版本控制
  4. GitHub 项目管理
    1. GitHub的"Issues" 如下作用:
      1. bug跟踪
      2. 请求新特性
      3. 计划好的新特性
      4. 发布或者版本管理
  5. git-flow git工作流
  6. py.test 单元测试
  7. tox 标准化测试
  8. Sphinx 自动生成HTML文档
  9. TravisCI 持续测试集成
  10. ReadTheDocs 持续文档集成
  11. Cookiecutter  为开始下一个项目自动生成这些步骤

66号公路
翻译于 2年前

3人顶

 

 翻译的不错哦!

项目布局

当准备一个项目时,正确合理的布局(目录结构)是十分重要的。一个合理的布局意味着想参与开发者不必花时间来寻找某些代码的位置; 凭直觉就可以找到文件的位置。因为我们在处理一个项目,就意味着可能需要到处移动一些东西。

让我们从顶层开始。大多数项目都有很多顶层文件(如setup.py, README.md, requirements等等)。每个项目至少应该有下面三个目录:

  1. doc目录,包括项目文档
  2. 项目目录,以项目命名,存储实际的Python包
  3. test目录,包含下面两部分
    1. 在这个目录下包括了测试代码和资源
    2. 作为一个独立顶级包

为了更好理解文件该如何组织,这里是一个我的简单项目:sandman 布局快照。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

$ pwd

~/code/sandman

$ tree

.

|- LICENSE

|- README.md

|- TODO.md

|- docs

|   |-- conf.py

|   |-- generated

|   |-- index.rst

|   |-- installation.rst

|   |-- modules.rst

|   |-- quickstart.rst

|   |-- sandman.rst

|- requirements.txt

|- sandman

|   |-- __init__.py

|   |-- exception.py

|   |-- model.py

|   |-- sandman.py

|   |-- test

|       |-- models.py

|       |-- test_sandman.py

|- setup.py

如你所看到那样,这里有一些顶层文件,一个docs目录(建立一个空目录,因为sphinx会将生成的文档放到这里),一个sandman目录,以及一个在sandman目录下的test目录。

66号公路
翻译于 2年前

2人顶

 

 翻译的不错哦!

setuptools 和 setup.py文件

setup.py文件,你可能已经在其它包中看到过,被distuils包用来安装Python包的。对于任何一个项目,它都是一个很重要的文件,因为它包含了版本,包依赖信息,PyPi需要的项目描述,你的名字和联系信息,以及其它一些信息。它允许以编程的方式搜索安装包,提供元数据和指令说明让工具如何做。

setuptools包(实际上就是对distutils的增强)简单化了建立发布python包。使用setuptools给python包打包,和distutils打包没什么区别。这实在是没有任何理由不使用它。

66号公路
翻译于 2年前

0人顶

 

 翻译的不错哦!

setup.py应该放在你的项目的根目录。setup.py中最重要的一部分就是调用setuptools.setup,这里面包含了此包所需的所有元信息。这里就是sandman的setup.py的所有内容

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

from __future__ import print_function

from setuptools import setup, find_packages

from setuptools.command.test import test as TestCommand

import io

import codecs

import os

import sys

 

import sandman

 

here = os.path.abspath(os.path.dirname(__file__))

 

def read(*filenames, **kwargs):

    encoding = kwargs.get('encoding''utf-8')

    sep = kwargs.get('sep''\n')

    buf = []

    for filename in filenames:

        with io.open(filename, encoding=encoding) as f:

            buf.append(f.read())

    return sep.join(buf)

 

long_description = read('README.txt''CHANGES.txt')

 

class PyTest(TestCommand):

    def finalize_options(self):

        TestCommand.finalize_options(self)

        self.test_args = []

        self.test_suite = True

 

    def run_tests(self):

        import pytest

        errcode = pytest.main(self.test_args)

        sys.exit(errcode)

 

setup(

    name='sandman',

    version=sandman.__version__,

    url='http://github.com/jeffknupp/sandman/',

    license='Apache Software License',

    author='Jeff Knupp',

    tests_require=['pytest'],

    install_requires=['Flask>=0.10.1',

                    'Flask-SQLAlchemy>=1.0',

                    'SQLAlchemy==0.8.2',

                    ],

    cmdclass={'test': PyTest},

    author_email='jeff@jeffknupp.com',

    description='Automated REST APIs for existing database-driven systems',

    long_description=long_description,

    packages=['sandman'],

    include_package_data=True,

    platforms='any',

    test_suite='sandman.test.test_sandman',

    classifiers = [

        'Programming Language :: Python',

        'Development Status :: 4 - Beta',

        'Natural Language :: English',

        'Environment :: Web Environment',

        'Intended Audience :: Developers',

        'License :: OSI Approved :: Apache Software License',

        'Operating System :: OS Independent',

        'Topic :: Software Development :: Libraries :: Python Modules',

        'Topic :: Software Development :: Libraries :: Application Frameworks',

        'Topic :: Internet :: WWW/HTTP :: Dynamic Content',

        ],

    extras_require={

        'testing': ['pytest'],

    }

)

(感谢Christian Heimes的建议让setup.py更符合人们的语言习惯。反过来,也让我借用其它的项目一目了然了。)

大多数内容浅显易懂,可以从setuptools文档查看到,所以我只会触及"有趣"的部分。使用sandman.__version__和gettinglong_description方法(尽管我也记不住是哪一个,但是却可以从其它项目的setup.py中获得)来减少我们需要写的引用代码。相反,维护项目的版本有三个地方(setup.py, 包自身的__version__, 以及文档),我们也可以使用包的version来填充setup里面的version参数

66号公路
翻译于 2年前

0人顶

 

 翻译的不错哦!

long_description被Pypi在你项目的PyPI主页当做文档使用。这里有其他一个文件,README.md,其中包含几乎相同的内容,我使用pandoc依据README.md自动生成README.rst,因此我们只需看README.rst就行了,并将它的内容设置为long_description。

py.test (上面讨论过) 中有一个特殊的条目(pytest类)设置允许Python检查setup.py可否正常工作。这段代码直接来自py.test指导文档。

文件中的其他内容都是在设置文档中描述的安装参数。

Garfielt
翻译于 2年前

0人顶

 

 翻译的不错哦!

其他的setup.py参数

有一些sandman 用不到的启动参数,在你的包里可能会用到。举个例子,你可能正在分派一些脚本并希望你的用户能够从命令行执行。在这个例子中,脚本会和你其他的代码一起安装在正常的site-packages位置。用户安装完后,没有其他的简单方法运行它。基于这一点,setup可以带有一个的脚本参数来指明Python脚本应该如何安装。在包中安装一个调用go_foo.py的脚本,这个用来启动的调用包括下面这行:

?


1

scripts = ['go_foo.py'],

确保在脚本中填入相对路径,并不仅仅是一个名称 (如scripts = ['scripts/foo_scripts/go_foo.py']).同样,你的脚本应该以"shebang"行和"python"开始,如下:

?


1

#! /usr/bin/env python

distutils将会在安装过程中自动用当前解释器位置取代这一行。

如果你的包比我们这里讨论的要复杂,你可在官方文档中参看启动工具文档分布python模块

在这两者中,你可以解决一些你可能会遇到的问题。

徐继开
翻译于 2年前

0人顶

 

 翻译的不错哦!

代码管理:git, 项目管理:gitHub

在“以正确的方式开始一个Django项目”中,我建议版本控制使用git 或者 mercurial。如果对于以共享与贡献的项目来说,只有一个选择:git。事实上,从长远来说,如果你想人们能使用和参与贡献,那么不仅使用git很有必要,而且,你也能够使用GitHub来管理维护你的项目。

这并不是夸大其词(尽管很多人会以它为嚼头)。然而,管它好与差,git和GitHub事实上已经成为了开源项目的实际标准了。GitHub是很多潜在的贡献者最想注册的和最熟悉的。所以,我深信,这并不是掉以轻心,而是深思熟虑的产物。

66号公路
翻译于 2年前

0人顶

 

 翻译的不错哦!

新建一个README.md文件

在GitHub的代码仓库中,项目的描述是从项目的根目录中的:README.md文件获取的。这个文件应该包含下面几点:

  • 项目描述
  • 项目ReadTheDocs页面连接[@Lesus 注:请查看 工具与概念 ]
  • 一个用来显示当前构建状态的TravisCI按钮。
  • "Quickstart" 文档 (怎么快速安装和使用你的项目)
  • 若有非python依赖包,请列举它以及怎么安装它

它(README)读起来很傻的感觉,但是确是一个很重要的文件。它可能是你未来的用户或者贡献者首先从它了解你的项目的。花些时间来写一个清楚明白的说明和使用GFM(GitHubFlavoredMarkdown)来使它更好看。实际上,如果使用原生的Markdown来写文档不爽,那么可以在Github上使用立即预览来创建或者修改这个文件

我们还没触及列表中的第二和第三项(ReadTheDocs和TravisCI),你会在接下来看到。

66号公路
翻译于 2年前

0人顶

 

 翻译的不错哦!

使用"Issues"页

跟生活中的很多事情一样,你投入GitHub越多,你收获的越多。因为用户会使用GitHub的“Issues”页面反馈bug,使用该页面跟踪特性要求和改进是很有意义的。

更重要的是,它允许贡献者以一种优雅的方式看到:一个可能实现特性的列表以及自动化的管理合并请求流程(pull request)。GitHub的issues可以与评论、你项目里的其他issues及其他项目里的issues等交织,这使得“issues”页面成为一个有关所有bug修复、改进和新特性要求信息汇总的地方。

确保“Issues”及时更新,至少及时回应新的问题。作为一个贡献者,没有什么比修复bug后看着它呈现在issues页面并等待着被合并更有吸引力的了。

http://www.oschina.net/translate/open-sourcing-a-python-project-the-right-way

 

时间: 2024-11-03 10:58:03

以正确的方式开源 Python 项目(转)的相关文章

28款GitHub最流行的开源机器学习项目(一):TensorFlow排榜首

1. TensorFlow TensorFlow 是谷歌发布的第二代机器学习系统.据谷歌宣称,在部分基准测试中,TensorFlow的处理速度比第一代的DistBelief加快了2倍之多. 具体的讲,TensorFlow是一个利用数据流图(Data Flow Graphs)进行数值计算的开源软件库:图中的节点( Nodes)代表数学运算操作,同时图中的边(Edges)表示节点之间相互流通的多维数组,即张量(Tensors).这种灵活的架构可以让使用者在多样化的将计算部署在台式机.服务器或者移动设

最新C#开源资源项目

原文 http://www.cnblogs.com/jirigala/archive/2013/06/04/3116397.html 一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率.        NKalore 是一款编程语言,它扩展了C#允许在.net平台使用AOP.NKal

28款GitHub最流行的开源机器学习项目(二):TensorFlow排榜首

推荐:28款GitHub最流行的开源机器学习项目(一):TensorFlow排榜首 15. XGBoost XGBoot是设计为高效.灵活.可移植的优化分布式梯度 Boosting库.它实现了 Gradient Boosting 框架下的机器学习算法.XGBoost通过提供并行树Boosting(也被称为GBDT.GBM),以一种快速且准确的方式解决了许多数据科学问题.相同的代码可以运行在大型分布式环境如Hadoop.SGE.MP上.它类似于梯度上升框架,但是更加高效.它兼具线性模型求解器和树学

谷歌开源 Python Fire;一张图读懂 Python、R 的大数据应用等 | AI 开发者头条

▲ 内容预览: 谷歌开源 Python Fire NASA 发布 2017-2018 软件目录,供开发者免费使用 一张图看懂大数据中 R 语言的应用 一张图看懂大数据中 Python 的应用 每日推荐阅读 谷歌搜索技术分析,如何一步步实现"不止于关键词"? █ 谷歌开源 Python Fire 昨晚谷歌公布了新的 Python 工具包--Python Fire.它的功能很简单:能从任何 Python 代码生成命令行接口(CLI).开发者面对任意一个 Python 程序,仅需调用 Pyt

C++开源代码项目汇总

Google的C++开源代码项目 v8  -  V8 JavaScript EngineV8 是 Google 的开源 JavaScript 引擎.V8 采用 C++ 编写,可在谷歌浏览器(来自 Google 的开源浏览器)中使用.V8 根据 ECMA-262 第三版中的说明使用 ECMAScript,并在使用 IA-32 或 ARM 处理器的 Windows XP 和 Vista.Mac OS X 10.5 (Leopard) 以及 Linux 系统中运行.V8 可以独立运行,也可以嵌入任何

为 Python 项目自动生成的依赖文件 Pigar

Pigar 详细介绍 Pigar 是为 Python 项目自动生成精确无误的依赖文件. 用 pip 安装: $ [sudo] pip install pigar pigar 能找区别不同 Python 版本之间的差异,非常精确,并找出依赖包在代码中的哪些位置引用了,这非常方便,可以发现某些无用却引用了的包: $ pigar # example/e1.py: 18 pkg_a == 3.3.3 # example/e2.py: 10 pkg_b == 1.1.1 如果你折腾别人的项目的时候遇到"I

开源 iOS 项目分类索引大全

mattt大神的发布程序:https://github.com/nomad/shenzhen ----------------Mac完整项目----------电台:https://github.com/myoula/sostart ----------------iOS完整项目----------------1,豆瓣相册 https://github.com/TonnyTao/DoubanAlbum2,voa在线英语 https://github.com/cubewang/NewsReader

无模版python项目中uwsgi的reload

问题描述 无模版python项目中uwsgi的reload 我在文档中只找到了django模板生成的项目,如何执行uwsgi reload,是命令行输入: uwsgi --reload project-master.pid 但是我的项目只是用一个python文件输出了一行"hello world",不知道哪个pid文件是对应这个python项目的,或者这里uwsgi的reload方式和django不同吗? 解决方案 这个是在你的uwsgi的ini配置文件中指定的. 设置pidfile为

android git上开源的项目收藏

本文为那些不错的Android开源项目第一篇--个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等.   最新内容请访问AndroidOpenProject@Github,欢迎Star和Fork.   Androi