什么是 setup.py
,如何配置或使用它?
setup.py
是一个 python 文件,它的存在表明您要安装的模块/包可能已使用 Distutils 打包和分发,这是分发 Python 模块的标准。
这使您可以轻松安装 Python 包。通常写下就足够了:
$ pip install .
pip
将使用 setup.py
安装您的模块。避免直接调用 setup.py
。
https://docs.python.org/3/installing/index.html#installing-index
它有助于在您的机器上安装一个 python 包 foo
(也可以在 virtualenv
中),以便您可以从其他项目以及 [I]Python 提示中导入包 foo
。
它的工作与 pip
、easy_install
等类似,
使用 setup.py
让我们从一些定义开始:
包 - 包含 __init__.py
文件的文件夹/目录。 模块 - 带有 .py
扩展名的有效 python 文件。 分发 - 一个包 与其他包 和模块 的关系。
假设您要安装一个名为 foo
的软件包。然后你做,
$ git clone https://github.com/user/foo
$ cd foo
$ python setup.py install
相反,如果您不想实际安装它但仍想使用它。然后做,
$ python setup.py develop
此命令将在站点包中创建指向源目录的符号链接,而不是复制内容。正因为如此,它非常快(特别是对于大包装)。
创建setup.py
如果你有你的包树,
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
└── setup.py
然后,您在 setup.py
脚本中执行以下操作,以便可以将其安装在某些机器上:
from setuptools import setup
setup(
name='foo',
version='1.0',
description='A useful module',
author='Man Foo',
author_email='foomail@foo.example',
packages=['foo'], #same as name
install_requires=['wheel', 'bar', 'greek'], #external packages as dependencies
)
相反,如果您的包树更复杂,如下所示:
foo
├── foo
│ ├── data_struct.py
│ ├── __init__.py
│ └── internals.py
├── README
├── requirements.txt
├── scripts
│ ├── cool
│ └── skype
└── setup.py
那么,在这种情况下,您的 setup.py
将类似于:
from setuptools import setup
setup(
name='foo',
version='1.0',
description='A useful module',
author='Man Foo',
author_email='foomail@foo.example',
packages=['foo'], #same as name
install_requires=['wheel', 'bar', 'greek'], #external packages as dependencies
scripts=[
'scripts/cool',
'scripts/skype',
]
)
向 (setup.py
) 添加更多内容 &让它体面:
from setuptools import setup
with open("README", 'r') as f:
long_description = f.read()
setup(
name='foo',
version='1.0',
description='A useful module',
license="MIT",
long_description=long_description,
author='Man Foo',
author_email='foomail@foo.example',
url="http://www.foopackage.example/",
packages=['foo'], #same as name
install_requires=['wheel', 'bar', 'greek'], #external packages as dependencies
scripts=[
'scripts/cool',
'scripts/skype',
]
)
long_description
在 pypi.org 中用作软件包的 README 描述。
最后,您现在可以将包上传到 PyPi.org,以便其他人可以使用 pip install yourpackage
安装您的包。
此时有两种选择。
在临时的 test.pypi.org 服务器上发布以熟悉程序,然后在永久的 pypi.org 服务器上发布,以供公众使用您的包。
如果您已经熟悉该过程并拥有您的用户凭据(例如,用户名、密码、包名),请立即在永久 pypi.org 服务器上发布
一旦您的软件包名称在 pypi.org 中注册,任何人都无法声明或使用它。 Python packaging suggests the twine package 用于上传(将您的包上传到 PyPi)。因此,
第一步是使用以下命令在本地构建发行版: # prereq: wheel (pip install wheel) $ python setup.py sdist bdist_wheel 然后使用 twine 上传到 test.pypi.org 或 pypi.org: $ twine upload --repository testpypi dist/* 用户名:*** 密码:***
包需要几分钟才能出现在 test.pypi.org
上。一旦您对它感到满意,您就可以将您的包裹上传到真实的& pypi.org 的永久索引只需:
$ twine upload dist/*
或者,您还可以通过以下方式使用 GPG
对包中的文件进行签名:
$ twine upload dist/* --sign
额外阅读:
在此处查看来自真实项目的示例 setup.py:torchvision-setup.py
PEP 517,设置工具
为什么要缠绕?使用麻线
requests
的作者)有这个项目来明确给出 setup.py 的一个很好的例子——github.com/kennethreitz/setup.py
requirements.txt
文件并填充一个可迭代对象,例如 requirements
并将此可迭代对象 requirements
分配给 install_requires
。有关示例,请参阅此页面 setup.py requirements.txt。
python setyp.py install --user
setup.py
是 Python 对多平台安装程序和 make
文件的回答。
如果您熟悉命令行安装,那么 make && make install
将转换为 python setup.py build && python setup.py install
。
一些包是纯 Python 的,并且只是字节编译的。其他可能包含本机代码,这将需要本机编译器(如 gcc
或 cl
)和 Python 接口模块(如 swig
或 pyrex
)。
python setup.py install
actually runs python setup.py build
first(因此您不需要单独运行它们,除非在特定情况下)。我相信 make
总是需要在运行 make install
之前手动运行。
make
不需要任何特定参数(或顺序):完全取决于 Makefile
的创建者哪些“目标”可用(以及需要以什么顺序调用它们)。由于裸 Makefile
(通常)不是很便携,它们往往是使用 ./configure
(autotools)或 cmake .
(cmake)等命令生成的,因此由这些程序来定义您是否需要显式是否在 make install
之前运行 make
。
如果您下载了根文件夹中包含“setup.py”的软件包,您可以通过运行安装它
python setup.py install
如果您正在开发一个项目并且想知道这个文件有什么用处,请检查 Python documentation on writing the Setup Script
site-packages
中?
setup.py
是一个 Python 脚本,通常随库或程序一起提供,使用该语言编写。它的目的是正确安装软件。
许多软件包将 distutils
框架与 setup.py
结合使用。
http://docs.python.org/distutils/
setup_mathmod.py
?
setup.py
只是一个约定
setup.py 可以在两种情况下使用,首先,您要安装 Python 包。其次,您想创建自己的 Python 包。通常标准的 Python 包有几个重要的文件,比如 setup.py、setup.cfg 和 Manifest.in。在创建 Python 包时,这三个文件将确定(egg-info 文件夹下的 PKG-INFO 中的内容)名称、版本、描述、其他所需的安装(通常在 .txt 文件中)和其他一些参数。 setup.cfg 在创建包时由 setup.py 读取(可能是 tar.gz )。 Manifest.in 是您可以定义包中应包含的内容的地方。无论如何,您可以使用 setup.py 做很多事情,例如
python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo] (to upload package to pypi or local repo)
还有许多其他命令可以与 setup.py 一起使用。求助
python setup.py --help-commands
python setup.py --help-commands
。在深入研究 setup.py 时非常有用。
setup.py
是一个与其他文件一样的 Python 文件。它可以采用任何名称,但按照惯例将其命名为 setup.py
,以便每个脚本没有不同的过程。
最常见的 setup.py
用于安装 Python 模块,但用于其他目的:
模块:
也许这是 setup.py
最著名的用法是在模块中。虽然它们可以使用 pip
安装,但旧 Python 版本默认不包含 pip
,需要单独安装。
如果您想安装一个模块但不想安装 pip
,那么唯一的选择就是从 setup.py
文件安装模块。这可以通过 python setup.py install
实现。这会将 Python 模块安装到根字典(没有 pip
、easy_install
等)。
当 pip
将失败时,通常使用此方法。例如,如果所需软件包的正确 Python 版本无法通过 pip
获得,可能是因为它不再维护,下载源代码并运行 python setup.py install
将执行相同的操作,除非需要编译的二进制文件, (但将忽略 Python 版本 - 除非返回错误)。
setup.py
的另一个用途是从源代码安装软件包。如果模块仍在开发中,则轮子文件将不可用,唯一的安装方法是直接从源安装。
构建 Python 扩展:
构建模块后,可以使用 distutils setup script 将其转换为准备分发的模块。构建后,可以使用上面的命令安装这些。
安装脚本很容易构建,并且一旦文件已正确配置并且可以通过运行 python setup.py build
进行编译(请参阅所有命令的链接)。
再次将其命名为 setup.py
是为了便于使用和按照惯例,但可以采用任何名称。
赛通:
setup.py
文件的另一个著名用途包括已编译的扩展。这些需要具有用户定义值的设置脚本。它们允许快速(但一旦编译依赖于平台)执行。以下是 documentation 中的一个简单示例:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_modules = cythonize("hello.pyx"),
)
这可以通过 python setup.py build
编译
Cx_Freeze:
另一个需要安装脚本的模块是 cx_Freeze
。这会将 Python 脚本转换为可执行文件。这允许许多命令,如描述、名称、图标、包,包括、排除等,一旦运行将产生一个可分发的应用程序。 documentation 中的示例:
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "guifoo",
version = "0.1",
description = "My GUI application!",
options = {"build_exe": build_exe_options},
executables = [Executable("guifoo.py", base=base)])
这可以通过 python setup.py build
编译。
那么什么是 setup.py
文件?
很简单,它是一个在 Python 环境中构建或配置某些东西的脚本。
分发的包应仅包含一个安装脚本,但将几个组合在一起形成一个安装脚本的情况并不少见。请注意,这通常涉及 distutils
,但并非总是如此(正如我在上一个示例中所展示的那样)。要记住它只是以某种方式配置 Python 包/脚本。
它采用名称,因此在构建或安装时始终可以使用相同的命令。
当您使用 setup.py
下载软件包时,请打开终端(Mac、Linux)或命令提示符 (Windows)。使用 cd
并帮助您使用 Tab 按钮将路径设置为您下载文件的文件夹以及 setup.py
所在的文件夹:
iMac:~ user $ cd path/pakagefolderwithsetupfile/
按回车,你应该会看到如下内容:
iMac:pakagefolderwithsetupfile user$
然后在此 python setup.py install
之后键入:
iMac:pakagefolderwithsetupfile user$ python setup.py install
按 enter
。完毕!
为简单起见,当您调用 install functions 提到的其他答案时,setup.py 作为 "__main__"
运行。在 setup.py 中,您应该放置安装包所需的所有内容。
常用 setup.py 函数
以下两节讨论了许多 setup.py 模块所具有的两件事。
安装工具.setup
此函数允许您指定 project attributes,例如项目名称、版本...。最重要的是,此函数允许您安装正确打包的其他函数。有关 setuptools.setup 的示例,请参见 this webpage
setuptools.setup 的这些属性可以安装这些类型的软件包:
使用 setuptools.findpackages 导入项目并在 PyPI 中列出的包: packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])
不在 PyPI 中的包,但可以使用 dependency_links dependency_links=["http://peak.telecommunity.com/snapshots/",] 从 URL 下载
自定义函数
在理想情况下,setuptools.setup
会为您处理一切。不幸的是,情况并非总是如此。有时您必须执行特定操作,例如使用 subprocess 命令安装依赖项,以使您正在安装的系统处于适合您的软件包的正确状态。尽量避免这种情况,这些函数会让人感到困惑,并且在 OS 甚至 distribution 之间经常会有所不同。
要安装您下载的 Python 包,请提取存档并在其中运行 setup.py 脚本:
python setup.py install
对我来说,这一直很奇怪。将包管理器指向下载会更自然,就像在 Ruby 和 Nodejs 中所做的那样,例如。 gem install rails-4.1.1.gem
包管理器也更舒服,因为它熟悉且可靠。另一方面,每个 setup.py
都是新颖的,因为它特定于包。它要求对约定有信心“我相信这个 setup.py 采用与我过去使用过的其他命令相同的命令”。这是对精神意志力的令人遗憾的征税。
我并不是说 setup.py 工作流程不如包管理器安全(我知道 Pip 只是在里面运行 setup.py),但我当然觉得它很尴尬和不和谐。所有命令都指向同一个包管理器应用程序,这是一种和谐。你甚至可能会喜欢它。
setup.py
文件的用途。