如何打包和分发python程序(.py源代码),以便其他开发人员可以轻松安装所有必需的依赖项?

时间:2017-05-31 17:35:57

标签: python python-3.x deployment pip python-module

我正在开发一个Python应用程序,它构建了一些我用pip安装的软件包,例如Flask,requests,PIL。

那么我如何分发我的程序,以便其他人可以轻松安装每个必需的依赖项/包,并简单地让它在每台计算机上运行?是setup.py我在寻找什么或根本没有?如果是这样,你能解释一下它的作用并提供一个示例setup.py来做我正在尝试做的事情吗?

PS:我也有这个小问题:我是否需要在程序的顶级文件夹中或在子目录中提供__init__.py?

4 个答案:

答案 0 :(得分:5)

在不太古老的日子里,我使用this guide来学习如何打包和分发我的python代码,然后创建了一些优秀的人flit,这使我可以分三步完成整个过程。 / p>

$pip install flit

创建我的元数据文件:

[metadata]
author=Some guy
author-email=some-email@nowhere.com
home-page=https://github.com/someuser/somepackage
requires=requests
requires-python= >=3
description-file=README.rst
classifiers=Intended Audience :: Developers
    License :: OSI Approved :: BSD License
    Programming Language :: Python :: 3
    Topic :: Software Development :: Libraries :: Python Modules

发布我的包裹:

$pip flit publish

完成了!!!

答案 1 :(得分:2)

根据文件here

  

setup.py

     

Python库还有另一种依赖规范   称为setup.py。 Setup.py是分发和的标准   安装Python库。如果你正在构建一个Python库,那么   作为请求或内衣,您必须包括setup.py所以依赖   经理可以正确安装库以及其他   库的依赖关系。还有一点混乱   在Python社区中,requirements.txt之间的区别   和setup.py,所以请阅读这篇写得很好的文章   澄清。

同时检查:

What is setup.py?

您可以看到此示例,了解如何制作您的示例:

https://github.com/pypa/sampleproject/blob/master/setup.py

另外,这里有一个指南:

https://pythonhosted.org/an_example_pypi_project/setuptools.html

答案 2 :(得分:2)

wrapAll()是pandas安装文件的链接,您可以在其中查看它们如何执行对依赖项的检查,它们可能是特定于平台的,也可能是任何第三方软件包

答案 3 :(得分:0)

不幸的是,python包装有a complicated history,新工具仍然出现。我的理解是,目前的黄金标准"是使用setup_tools来定义setup.py文件。该文件允许其他人使用pip安装项目的源代码。如果您希望能够先安装pip而不先明确下载源代码,则需要publish your project to pypi使用python setup.py upload

以下是我用作起点的setup.py样板:

#!/usr/bin/env python
""" boilerplate for new project setup.py """

from setuptools import setup
import io

import projectname

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.md') #, 'CHANGES.txt')

setup(name='projectname',
    version=projectname.__version__,
    description='short desc of projectname',
    long_description=long_description,
    author='Tylar Murray',
    author_email='code+projectname@tylar.info',
    url='https://github.com/7yl4r/projectname',

    tests_require=['nose'],
    install_requires=[
        'networkx'  # or whatever
    ],
    #cmdclass={'test': PyTest},

    packages=['projectname', 'OtherProjectProvidedPackage2']
)

注意:此模板要求您在顶级README.md

中设置__version__="0.1.23"和类似__init__.py的内容

关于你的P.S.问题:从技术上讲,你应该为此开一个新问题,但简而言之,答案是你应该同时包括herethis answer particularly