UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

106 lines (61 loc) 9.07 kB
**[Package creation guidelines](/index.php/Creating_packages "Creating packages")** * * * [CLR](/index.php/CLR_package_guidelines "CLR package guidelines") – [Cross](/index.php/Cross-compiling_tools_package_guidelines "Cross-compiling tools package guidelines") – [Eclipse](/index.php/Eclipse_plugin_package_guidelines "Eclipse plugin package guidelines") – [Free Pascal](/index.php/Free_Pascal_package_guidelines "Free Pascal package guidelines") – [GNOME](/index.php/GNOME_package_guidelines "GNOME package guidelines") – [Go](/index.php/Go_package_guidelines "Go package guidelines") – [Haskell](/index.php/Haskell_package_guidelines "Haskell package guidelines") – [Java](/index.php/Java_package_guidelines "Java package guidelines") – [KDE](/index.php/KDE_package_guidelines "KDE package guidelines") – [Kernel](/index.php/Kernel_module_package_guidelines "Kernel module package guidelines") – [Lisp](/index.php/Lisp_package_guidelines "Lisp package guidelines") – [MinGW](/index.php/MinGW_package_guidelines "MinGW package guidelines") – [Node.js](/index.php/Node.js_package_guidelines "Node.js package guidelines") – [Nonfree](/index.php/Nonfree_applications_package_guidelines "Nonfree applications package guidelines") – [OCaml](/index.php/OCaml_package_guidelines "OCaml package guidelines") – [Perl](/index.php/Perl_package_guidelines "Perl package guidelines") – [PHP](/index.php/PHP_package_guidelines "PHP package guidelines") – [Python](/index.php/Python_package_guidelines "Python package guidelines") – [Ruby](/index.php/Ruby_Gem_package_guidelines "Ruby Gem package guidelines") – [VCS](/index.php/VCS_package_guidelines "VCS package guidelines") – [Web](/index.php/Web_application_package_guidelines "Web application package guidelines") – [Wine](/index.php/Wine_package_guidelines "Wine package guidelines") **翻译状态:** 本文是英文页面 [Python package guidelines](/index.php/Python_package_guidelines "Python package guidelines") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2017-09-13,点击[这里](https://wiki.archlinux.org/index.php?title=Python+package+guidelines&diff=0&oldid=488822)可以查看翻译后英文页面的改动。 本文档描述了如何基于标准 [PKGBUILDs](/index.php/PKGBUILD "PKGBUILD") 来为 [Python](/index.php/Python "Python") 程序进行打包. ## Contents * [1 包命名](#.E5.8C.85.E5.91.BD.E5.90.8D) * [1.1 带版本的软件包](#.E5.B8.A6.E7.89.88.E6.9C.AC.E7.9A.84.E8.BD.AF.E4.BB.B6.E5.8C.85) * [2 安装方式](#.E5.AE.89.E8.A3.85.E6.96.B9.E5.BC.8F) * [2.1 distutils](#distutils) * [2.2 setuptools](#setuptools) * [2.3 pip](#pip) * [3 注意事项](#.E6.B3.A8.E6.84.8F.E4.BA.8B.E9.A1.B9) * [3.1 PyPI 下载 URLs](#PyPI_.E4.B8.8B.E8.BD.BD_URLs) ## 包命名 Python 3 的包应该使用 `python-*modulename*` 进行命名。如果软件包与 Python 某个生态系统(例如 pip 或 tox) 关系密切,请添加相应前缀。对于其他 Python 程序来说, 使用程序名就足够了。无论如何, 包的名字应该完全使用小写。 这同样适用于 Python 2,只需要修改前缀为 `python2-` (如果必须)。 ### 带版本的软件包 如果你需要添加一个带版本的软件包,请使用这种格式: `python-*模块名*-*版本*`, 比如 `python-colorama-0.2.5`。这样,Python 的依赖`colorama==0.2.5` 就会成为名为 `python-colorama-0.2.5` 的 Arch 软件包。 ## 安装方式 Python 的包通常使用 Python 语言自带的工具来安装, 例如 [pip](https://pip.pypa.io/) 或者 [easy_install](https://setuptools.readthedocs.io/en/latest/easy_install.html), 这些工具就像是能从在线源 (通常是 [PyPI](https://pypi.python.org/), Python 包索引 (Python Package Index) ) 获取源文件的软件包管理器一样,而且还能跟踪相关的文件状态。 (如需这两个工具的详细比较,请参见 [pip vs easy_install](https://packaging.python.org/pip_easy_install/#pip-vs-easy-install)). 然而,如果要想使用 PKGBUILD 文件来帮助安装 Python 软件包的话,标准化的 [distutils](http://docs.python.org/library/distutils.html) 可以说是最方便的了。它会使用已下载源码包里面的 `setup.py` 接着就能很轻松地将文件安装到 `*$pkgdir*/usr/lib/python*<python 版本>*/site-packages/*$pkgname*` 这个文件夹下面了。 ### distutils [这里](https://projects.archlinux.org/abs.git/tree/prototypes/PKGBUILD-python.proto)有一个 *distutils* PKGBUILD 样本。他遵从下面的格式: ``` *<python 版本>* setup.py install --root="$pkgdir/" --optimize=1 ``` 其中: * 根据程序所使用的 Python 版本来使用 `python` 或者 `python2` 替换 *<python 版本>** `--root="$pkgdir/"` 选项是为了防止文件直接安装到主系统而不是打包目录中。如果直接安装到主系统中,会产生权限错误。 * `--optimize=1` 选项是用来编译生成 `.pyo` 文件,好让 [pacman](/index.php/Pacman "Pacman") 更好的跟踪优化她们。 ### setuptools Python 包装机制已从 *distutils**setuptools* 迁移, 后者目前正处于活跃开发时期并且能直接在 `setup.py` 文件中替换前者。不过主要的区别在于,*setuptools* 并没有和 Python 主包打在一起,因此你必须将其指定为 `makedepends`。 如果成品包中存在导入 (import) 了 [`pkg_resources` 模块](https://setuptools.readthedocs.io/en/latest/setuptools.html#automatic-script-creation) 的二进制, 那么 *setuptools* 必须在分包函数 `package_*()` 中另外指定为 `depends`; 还有, 如果 PKGBUILD 只安装一个版本的 Python 包的话, *setuptools* 需要从 `makedepends` 移至 `depends`### pip 如果你需要使用 *pip* (由 [python-pip](https://www.archlinux.org/packages/?name=python-pip) 和 [python2-pip](https://www.archlinux.org/packages/?name=python2-pip) 提供), *例如* 为了安装 [wheel](https://bitbucket.org/pypa/wheel/) 的Python包, 请记得传入下列参数: ``` PIP_CONFIG_FILE=/dev/null pip install --isolated --root="$pkgdir" --ignore-installed --no-deps *.whl ``` * `PIP_CONFIG_FILE=/dev/null` 此参数会使 **pip** 忽略 `{/etc,~/.config}/pip.conf` 因为这个配置文件可能会向 **pip** 添加一些额外参数。 * `--isolated` 此参数会使 **pip** 忽略环境变量 (以及 `{/etc,~/.config}/pip/pip.conf`) 否则 **pip** 又会被添加一些额外参数。 * `--ignore-installed` 在 [https://github.com/pypa/pip/issues/3063](https://github.com/pypa/pip/issues/3063) 处提出的问题解决之前,把这个参数加上吧 (不然的话 **pip** 会在有早期 `--user` 安装痕迹的情况下跳过安装). * `--no-deps` 此参数能确保依赖不会跟着一起被打进主包里面去。 *pip* 不知道如何生成 `.pyo` 文件 (see [https://github.com/pypa/pip/issues/2209](https://github.com/pypa/pip/issues/2209)). 为了生成 `.pyo` 文件,在使用 *pip* 安装后, 运行: ``` python -O -m compileall "${pkgdir}/path/to/module ``` ## 注意事项 绝大部分情况下, 你应该设置 `arch``any` ,因为绝大部分 Python 包是平台无关的。 请不要将文件安装到类似于 `tests` 这样名字的目录中, 因为这很容易与其他 Python 包发生文件冲突 (比方说, `/usr/lib/python2.7/site-packages/tests/`). ### PyPI 下载 URLs PyPI 中像是这种格式 `https://pypi.python.org/packages/source/${_name:0:1}/${_name}/${_name}-${pkgver}.tar.gz`<footnote> 的 URL 已经在 2016 年静默失效了, 而新的格式需要一种只有从 PyPI 网站才能取得的不可预测的哈希码[[1]](https://bitbucket.org/pypa/pypi/issues/438/backwards-compatible-un-hashed-package#comment-27230605)。 在下游维护者向 PyPI 维护者抱怨了这个问题 [[2]](https://bitbucket.org/pypa/pypi/issues/438/backwards-compatible-un-hashed-package) 之后, 一种新的稳定的格式出现了 [[3]](https://bitbucket.org/pypa/pypi/issues/438/backwards-compatible-un-hashed-package#comment-27606213): [PKGBUILD#source](/index.php/PKGBUILD#source "PKGBUILD") `source=()` 数值现在需要使用如下 URL 模板: 请注意,我们使用了自定义的 `$_name` 而不是 `$pkgname`,因为 Python 包通常都命名成这样: `python-$_name` 源码包 `https://files.pythonhosted.org/packages/source/${_name::1}/${_name}/${_name}-${pkgver}.tar.gz` 双版本 wheel 包 (Python 2 和 Python 3 都兼容) `https://files.pythonhosted.org/packages/py2.py3/${_name::1}/$_name/$_name-$pkgver-$_name-$pkgver-py2.py3-none-any.whl` 特定架构的 wheel 包 对于特定架构的 wheel 包,可以使用 `source_x86_64=('...')` 来表示 x86_64 架构的下载地址。与此同时可以使用 `_py=py36` 来避免重复书写 Python 版本: `https://files.pythonhosted.org/packages/$_py/${_name::1}/$_name/$_name-$pkgver-$_py-${_py}m-manylinux1_x86_64.whl`