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

Posted

技术标签:

【中文标题】如何打包和分发 python 程序(.py 源代码),以便其他开发人员可以轻松安装所有需要的依赖项?【英文标题】:How to pack and distribute python program (.py source code) so that other developers can easily install all required dependencies? 【发布时间】:2017-11-01 15:29:00 【问题描述】:

我正在开发一个 Python 应用程序,该应用程序由我用 pip 安装的一些包构建,例如 Flask、requests、PIL。

那么我如何分发我的程序,以便其他人可以轻松地安装每个所需的依赖项/包,并让它在每台计算机上运行? setup.py 是我要找的还是根本不找的?如果是这样,您能否解释一下它的作用并提供一个示例 setup.py 来完成我正在尝试做的事情?

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

【问题讨论】:

提供一个安装文件,您可以在其中检查每个依赖项 Elia,对不起,我一开始没有很好地理解你的问题。是的,您正在寻找 setup.py,这是最好的方法 您可以按照指南here @DamianLattenero 我希望以 .py 文件的形式共享/分发我的应用程序,并且我想包含一种安装丢失包的简单方法。另外我的项目本身是一个应用程序/独立的,它不打算在其他项目中导入,换句话说:它不应该是一个库,只是一个程序,我不知道这是否有任何区别跨度> 【参考方案1】:

根据文档here

setup.py

Python 库还有另一种依赖规范 称为 setup.py。 Setup.py 是一个标准的分发和 安装 Python 库。如果您正在构建 Python 库,例如 作为请求或内衣,您必须包含 setup.py 所以依赖 manager 可以正确安装库以及其他 库的依赖项。还是有不少迷茫 在 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】:

here 是 pandas 设置文件的链接,您可以在其中查看它们如何检查其依赖项,它们可能是特定于平台或任何第三方包特定的

【讨论】:

这是一个很好的答案!很高兴提供一个例子,这样他就可以沿着一条路走,+1【参考方案3】:

在不那么古老的日子里,我使用this guide 来学习如何打包和分发我的python 代码,然后一些好人创建了flit,它允许我分三步完成整个过程。

$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

完成了!!!

【讨论】:

【参考方案4】:

可惜python打包有a complicated history,新工具还在不断涌现。我的理解是,目前的“黄金标准”是使用setup_tools定义一个setup.py文件。该文件将允许其他人使用 pip 安装您项目的源代码。如果您希望能够使用 pip 安装而无需先显式下载源代码,则需要使用 python setup.py upload publish your project to pypi。

下面是我用作起点的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']
)

注意:此模板要求您在***__init__.py 中有README.md__version__="0.1.23" 之类的东西

关于您的 P.S.问题:从技术上讲,您应该为此提出一个新问题,但简而言之,答案是您应该包括here 和this answer particularly。

【讨论】:

以上是关于如何打包和分发 python 程序(.py 源代码),以便其他开发人员可以轻松安装所有需要的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何分发 python 程序?

Python打包分发工具setuptools

如何将python3.6软件的py文件打包成exe程序

请问python的打包程序 pyinstaller 怎么用啊?

如何打包 PySide2 应用程序以进行分发?

Python程序代码混淆、编译、打包、运行(桌面程序防破解向)