setup.py示例?

问题描述 投票:65回答:7

学习本页后:

http://docs.python.org/distutils/builtdist.html

我希望找到一些setup.py文件来研究,以便自己制作(目标是制作fedora rpm文件)。

可以s.o.社区指向一些好的例子?

python rpm
7个回答
50
投票

编写setup.py脚本here的完整演练。 (举几个例子)

如果你想要一个真实世界的例子,我可以指向你几个主要项目的setup.py脚本。 Django是here,pyglet是here。您可以浏览名为setup.py的文件的其他项目的源代码以获取更多示例。

这些不是简单的例子;我给出的教程链接有那些。这些更复杂,但也更实用。


29
投票

您可能会发现HitchHiker's Guide to Packaging很有帮助,即使它不完整。我从Quick Start tutorial开始。还可以尝试浏览Python Package Index上的Python包。只需下载tarball,解压缩,然后查看setup.py文件。或者更好的是,只需查看列出公共源代码存储库的软件包,例如在GitHub或BitBucket上托管的软件包。你必须在头版遇到一个。

我最后的建议就是去尝试制作一个;不要害怕失败。在我开始制作它们之前,我真的不理解它。在PyPI上创建一个新包并轻松删除它是微不足道的。所以,创建一个虚拟包并玩转。


24
投票

阅读第一个https://packaging.python.org/en/latest/current.html

Installation Tool Recommendations

  1. 使用pip从PyPI安装Python包。
  2. 使用virtualenv或pyvenv从共享的Python安装中隔离特定于应用程序的依赖项。
  3. 使用pip轮创建车轮分布缓存,以便>加速后续安装。
  4. 如果您正在寻找完全集成的跨平台软件堆栈的管理,请考虑构建(主要关注Web开发社区)或Hashdist或conda(主要关注于科学社区)。

Packaging Tool Recommendations

  1. 使用setuptools定义项目并创建源分发。
  2. 使用车轮项目中提供的bdist_wheel setuptools扩展来创建车轮。如果您的项目包含二进制扩展,这尤其有用。
  3. 使用twine将分发上传到PyPI。

这个anwser老了,确实有一个叫做蟒蛇包装世界的救援计划

wheels way

我在这里引用qazxsw poi:

什么是轮子?

轮子是python分布的新标准,旨在取代鸡蛋。支持以pip> = 1.4和setuptools> = 0.8提供。

车轮的优点

  1. 更快地安装纯python和本机C扩展包。
  2. 避免安装任意代码执行。 (避免setup.py)
  3. 安装C扩展不需要Windows或OS X上的编译器。
  4. 允许更好的缓存进行测试和持续集成。
  5. 创建.pyc文件作为安装的一部分,以确保它们与使用的python解释器匹配。
  6. 跨平台和机器的更一致的安装。

pythonwheels.com涵盖了正确的python包装(以及关于轮子)的完整故事


conda way

对于科学计算(这也是在packaging.python.org上推荐的,见上文)我会考虑使用packaging.python.org,它可以被看作是在PyPI和pip工具之上构建的第三方服务。它也非常适合设置你自己的CONDA packaging版本,所以我想它可以解决复杂的自定义企业包管理问题。

Conda可以安装到用户文件夹中(没有超级用户权限)并且像魔术一样工作

conda安装

和强大的虚拟环境扩展。


eggs way

这个选项与python-distribute.org有关,并且已经过时了(以及网站),所以让我指出一个我喜欢的即用型紧凑的setup.py示例:

  • 将脚本和单个python文件混合到setup.py中的一个非常实用的示例/实现是给binstar
  • 更好的一个来自here

该引用来自于setup.py状态的指南,仍然适用:

  • setup.py不见了!
  • distutils走了!
  • 分发了!
  • pip和virtualenv留在这里!
  • 鸡蛋......走了!

我再加一点(来自我)

  • 车轮!

我建议在尝试无意识的复制粘贴之前,先了解hyperopt(来自gotgenes指向的指南)。

互联网上的大多数例子都是从那里开始的

packaging-ecosystem

但是这例如不支持构建一个egg python setup.py bdist_egg(以及其他一些旧功能),这些功能可以在

from distutils.core import setup

原因是他们被弃用了。

现在根据指南

警告

请使用Distribute包而不是Setuptools包,因为此包中存在可以修复和不修复的问题。

不推荐使用的setuptools将被from setuptools import setup 取代,它将“成为Python 3.3中标准库的一部分”。我必须说我喜欢setuptools和egg,并且还没有完全相信distutils2的便利性。这个需要

distutils2

并安装

pip install Distutils2

PS

包装从来都不是微不足道的(人们通过尝试开发新的包装来学习这一点),所以我认为很多事情都是有道理的。我只是希望这次 将会 做得对。


5
投票

我推荐python -m distutils2.run install 示例项目的setup.py

Python包装用户指南“旨在成为如何使用当前工具打包,发布和安装Python发行版的权威资源”。


3
投票

在这里,您将找到使用distutils和setup.py的最简单的示例:

Python Packaging User Guide

这假设您的所有代码都在一个文件中,并告诉您如何打包包含单个模块的项目。


3
投票

看看这个完整的示例https://docs.python.org/2/distutils/introduction.html#distutils-simple-example的一个小python包。它基于https://github.com/marcindulak/python-mycli的打包建议,使用带有distutils的setup.py,另外还展示了如何创建RPM和deb包。

项目的setup.py包含在下面(请参阅完整源代码的repo):

https://packaging.python.org/en/latest/distributing.html

和RPM规范文件或多或少遵循Fedora / EPEL打包指南可能如下所示:

#!/usr/bin/env python

import os
import sys

from distutils.core import setup

name = "mycli"

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

# Restructured text project description read from file
long_description = open(os.path.join(rootdir, 'README.md')).read()

# Python 2.4 or later needed
if sys.version_info < (2, 4, 0, 'final', 0):
    raise SystemExit, 'Python 2.4 or later is required!'

# Build a list of all project modules
packages = []
for dirname, dirnames, filenames in os.walk(name):
        if '__init__.py' in filenames:
            packages.append(dirname.replace('/', '.'))

package_dir = {name: name}

# Data files used e.g. in tests
package_data = {name: [os.path.join(name, 'tests', 'prt.txt')]}

# The current version number - MSI accepts only version X.X.X
exec(open(os.path.join(name, 'version.py')).read())

# Scripts
scripts = []
for dirname, dirnames, filenames in os.walk('scripts'):
    for filename in filenames:
        if not filename.endswith('.bat'):
            scripts.append(os.path.join(dirname, filename))

# Provide bat executables in the tarball (always for Win)
if 'sdist' in sys.argv or os.name in ['ce', 'nt']:
    for s in scripts[:]:
        scripts.append(s + '.bat')

# Data_files (e.g. doc) needs (directory, files-in-this-directory) tuples
data_files = []
for dirname, dirnames, filenames in os.walk('doc'):
        fileslist = []
        for filename in filenames:
            fullname = os.path.join(dirname, filename)
            fileslist.append(fullname)
        data_files.append(('share/' + name + '/' + dirname, fileslist))

setup(name='python-' + name,
      version=version,  # PEP440
      description='mycli - shows some argparse features',
      long_description=long_description,
      url='https://github.com/marcindulak/python-mycli',
      author='Marcin Dulak',
      author_email='[email protected]',
      license='ASL',
      # https://pypi.python.org/pypi?%3Aaction=list_classifiers
      classifiers=[
          'Development Status :: 1 - Planning',
          'Environment :: Console',
          'License :: OSI Approved :: Apache Software License',
          'Natural Language :: English',
          'Operating System :: OS Independent',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.4',
          'Programming Language :: Python :: 2.5',
          'Programming Language :: Python :: 2.6',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.2',
          'Programming Language :: Python :: 3.3',
          'Programming Language :: Python :: 3.4',
      ],
      keywords='argparse distutils cli unittest RPM spec deb',
      packages=packages,
      package_dir=package_dir,
      package_data=package_data,
      scripts=scripts,
      data_files=data_files,
      )

0
投票

最小的例子

# Failsafe backport of Python2-macros for RHEL <= 6
%{!?python_sitelib: %global python_sitelib      %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
%{!?python_sitearch:    %global python_sitearch     %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%{!?python_version: %global python_version      %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])")}
%{!?__python2:      %global __python2       %{__python}}
%{!?python2_sitelib:    %global python2_sitelib     %{python_sitelib}}
%{!?python2_sitearch:   %global python2_sitearch    %{python_sitearch}}
%{!?python2_version:    %global python2_version     %{python_version}}

%{!?python2_minor_version: %define python2_minor_version %(%{__python} -c "import sys ; print sys.version[2:3]")}

%global upstream_name mycli


Name:           python-%{upstream_name}
Version:        0.0.1
Release:        1%{?dist}
Summary:        A Python program that demonstrates usage of argparse
%{?el5:Group:       Applications/Scientific}
License:        ASL 2.0

URL:            https://github.com/marcindulak/%{name}
Source0:        https://github.com/marcindulak/%{name}/%{name}-%{version}.tar.gz

%{?el5:BuildRoot:   %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)}
BuildArch:      noarch

%if 0%{?suse_version}
BuildRequires:      python-devel
%else
BuildRequires:      python2-devel
%endif


%description
A Python program that demonstrates usage of argparse.


%prep
%setup -qn %{name}-%{version}


%build
%{__python2} setup.py build


%install
%{?el5:rm -rf $RPM_BUILD_ROOT}
%{__python2} setup.py install --skip-build --prefix=%{_prefix} \
   --optimize=1 --root $RPM_BUILD_ROOT


%check
export PYTHONPATH=`pwd`/build/lib
export PATH=`pwd`/build/scripts-%{python2_version}:${PATH}
%if 0%{python2_minor_version} >= 7
%{__python2} -m unittest discover -s %{upstream_name}/tests -p '*.py'
%endif


%clean
%{?el5:rm -rf $RPM_BUILD_ROOT}


%files
%doc LICENSE README.md
%{_bindir}/*
%{python2_sitelib}/%{upstream_name}
%{?!el5:%{python2_sitelib}/*.egg-info}


%changelog
* Wed Jan 14 2015 Marcin Dulak <[email protected]> - 0.0.1-1
- initial version
© www.soinside.com 2019 - 2024. All rights reserved.