如何创建一个python 2.x包 - 简单的情况

mit*_*mit 19 python packaging python-2.x

请展示为python 2.x创建python包的简单和最新标准方法

我希望稍后使用pip来安装软件包.

包应该包含一个类:

class hello:
  def greet(self):
    print "hello"
Run Code Online (Sandbox Code Playgroud)

之后应该可以执行以下操作:

pip install my_package-0.1.1....
Run Code Online (Sandbox Code Playgroud)

然后使用它:

from my_package import hello

h = hello.hello()
h.greet()
Run Code Online (Sandbox Code Playgroud)

我要的是:

  • 目录和文件布局
  • 文件的内容
  • 用于创建可分发包文件的命令
  • 命令从distributable包文件安装包(最好使用pip)

我找到了几个howtos,但我仍然不确定这个非常简单和剥离的情况(没有嵌套包,删除所有文件和功能,可以在最简单的情况下省略)将如何处理,这是现代的这样做的方式.

我希望这个问题进入社区维基状态,所以你不会得到任何积分,我会给出足够的时间,并在几天之后标记答案,同时考虑投票和评论.

编辑:

我有一个我要分享的第一个运行示例,我使用了Marius Gedminas的答案.它不包含应该存在的所有内容,但它有效,因此它可以展示技术过程的核心.要添加更多必要部件,请阅读下面的Marius的答案.

目录结构:

MyProject/
    setup.py
    my_package.py
    README.txt
    MANIFEST.in
Run Code Online (Sandbox Code Playgroud)

setup.py:

from setuptools.import setup
setup(name='MyProject',
      version='0.1',
      py_modules=['my_package'])
Run Code Online (Sandbox Code Playgroud)

my_package.py:

class hello:
  def greet(self):
    print "hello"
Run Code Online (Sandbox Code Playgroud)

MANIFEST.in:

include *.txt
Run Code Online (Sandbox Code Playgroud)

要从此文件夹创建包,请进入MyProject文件夹并运行:

$ python setup.py sdist
Run Code Online (Sandbox Code Playgroud)

这将MyProject-0.1.tar.gz在子文件夹中创建一个文件dist/.将此文件复制到目标计算机上的文件夹中.

在目标计算机上运行此命令,该文件夹包含MyProject-0.1.tar.gz:

sudo pip install MyProject-0.1.tar.gz
Run Code Online (Sandbox Code Playgroud)

现在可能需要在目标计算机上注销并重新登录,因此将找到该程序包.之后,您可以使用python shell在目标机器上测试包:

$ python
>>> import my_package
>>> h = my_package.hello()
>>> h.greet()
hello
>>> 
Run Code Online (Sandbox Code Playgroud)

一旦这个工作,请记住添加其他必要的内容,请参阅Marius的答案如下.

Mar*_*nas 32

从简单开始

最简单的单文件包:

MyProject/
    setup.py
    my_package.py
Run Code Online (Sandbox Code Playgroud)

最简单的setup.py:

from setuptools import setup
setup(name='MyProject',
      version='0.1',
      author='Your Name',
      author_email='your.name@example.com',
      license='MIT',
      description='Example package that says hello',
      py_modules=['my_package'])
Run Code Online (Sandbox Code Playgroud)

在包中包含额外的文件

接下来你应该添加一个自述文件:

MyProject/
    MANIFEST.in
    README.rst
    setup.py
    my_package.py
Run Code Online (Sandbox Code Playgroud)

请注意新文件 - MANIFEST.in.它指定了哪些非Python文件应该包含在源代码分发中:

include *.rst
Run Code Online (Sandbox Code Playgroud)

人们会告诉你"哦,跳过清单,只需将文件添加到源代码控制中,setuptools就会找到它们".忽略这个建议,它太容易出错了.

使PyPI页面有用

在Python包索引上使README.rst可供人们在线查看是很有用的.所以改变你的setup.py来做

from setuptools import setup
with open('README.rst') as f:
    readme = f.read()
setup(name='MyProject',
      ...
      description='Example package that says hello',
      long_description=readme,
      ...)
Run Code Online (Sandbox Code Playgroud)

使用ReStructuredText标记可以获得更漂亮的页面.使用

python setup.py --long-description | rst2html
Run Code Online (Sandbox Code Playgroud)

尽早捕获ReStructuredText错误.

包中有多个Python模块

一个文件不会很快,所以将其更改为一个包(令人困惑的术语警告:Python包在一个带有a的目录中__init__ py,而不是在可分发的自包含存档中):

MyProject/
    MANIFEST.in
    README.rst
    setup.py
    my_package/
        __init__.py
        some_module.py
Run Code Online (Sandbox Code Playgroud)

并将setup.py更改为

from setuptools import setup, find_packages
with open('README.rst') as f:
    readme = f.read()
setup(name='MyProject',
      version='0.2',
      author='Your Name',
      author_email='your@email',
      license='MIT',
      description='Example package that says hello',
      long_description=readme,
      packages=find_packages())
Run Code Online (Sandbox Code Playgroud)

向公众发布

获取PyPI帐户 - 您只需要执行一次.

要进行发布,请确保setup.py中的版本号是正确的,然后运行

python setup.py sdist register upload
Run Code Online (Sandbox Code Playgroud)

而已.

告诉人们安装它

告诉他们

pip install MyProject
Run Code Online (Sandbox Code Playgroud)

(您在setup.py中指定的同名作为namesetup()的参数)

  • 我认为你已经在简单和包括最重要的额外内容之间找到了良好的平衡. (3认同)
  • 我在这里弯曲关于"最简单"的问题.虽然我绝对同意从简单开始很重要,但最终你需要成长.当发生这种情况时,增长路径应该是明确的. (2认同)