关于python:什么是setup.py?

What is setup.py?

有人能解释一下,什么是setup.py,如何配置或使用?


setup.py是一个python文件,它通常告诉您要安装的模块/包已经用distutils进行了打包和分发,distutils是分发python模块的标准。

这允许您轻松地安装python包。通常情况下,只要写下:

1
$ python setup.py install

模块将自行安装。

https://docs.python.org/3/installing/index.html安装索引


它有助于在您的计算机上安装一个python包foo(也可以在virtualenv中),这样您就可以从其他项目和python提示中导入该包foo

它的作用与pipeasy_install等类似。

使用setup.py

让我们从一些定义开始:

包-包含__init__.py文件的文件夹/目录。模块-扩展名为.py的有效python文件。分发-一个包如何与其他包和模块相关。

假设您要安装一个名为foo的包。然后你会的,

1
2
3
$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

相反,如果您不想实际安装它,但仍然想使用它。那就这么做吧,

1
$ python setup.py develop

此命令将创建指向站点包中源目录的符号链接,而不是复制内容。因此,它的速度相当快(特别是对于大包装)。

创建setup.py

如果你的包装树是这样的,

1
2
3
4
5
6
7
8
foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
└── setup.py

然后,在setup.py脚本中执行以下操作,以便可以将其安装到某些计算机上:

1
2
3
4
5
6
7
8
9
10
11
from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

相反,如果您的包树比下面的更复杂:

1
2
3
4
5
6
7
8
9
10
11
foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
├── scripts
│   ├── cool
│   └── skype
└── setup.py

那么,在这种情况下,您的setup.py应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

在(setup.py中添加更多内容,使其更体面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

long_description在pypi.org中用作包的自述描述。

最后,您现在可以将您的包上传到pypi.org,以便其他人可以使用pip install yourpackage安装您的包。

第一步是在pypi中声明包名称和空间,方法是:

1
$ python setup.py register

一旦注册了您的包名称,就没有人可以声明或使用它。注册成功后,您必须通过

1
$ python setup.py upload

或者,您也可以通过以下方式与GPG签署您的包裹:

1
$ python setup.py --sign upload

奖金:请看一个真实项目的示例setup.pytorchvision-setup.py


setup.py是python对多平台安装程序和make文件的回答。

如果您熟悉命令行安装,那么make && make install转换为python setup.py build && python setup.py install

有些包是纯python的,只编译了字节。其他可能包含本机代码,需要本机编译器(如gcccl和python接口模块(如swigpyrex)。


如果下载的包在根文件夹中有"setup.py",则可以通过运行

1
python setup.py install

如果您正在开发一个项目,并且想知道这个文件对什么有用,那么在编写安装脚本时检查python文档。


setup.py是一个python脚本,通常与用该语言编写的库或程序一起提供。它的目的是正确安装软件。

许多包结合使用setup.py框架使用distutils框架。

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


setup.py可以用于两个场景,首先,您要安装一个python包。其次,您要创建自己的python包。通常标准的python包有两个重要的文件,如setup.py、setup.cfg和manifest.in。创建python包时,这三个文件将确定(pkg-info文件夹下的内容)名称、版本、说明、其他所需安装(通常在.txt文件中)和其他几个参数。在创建包时,setup.py读取setup.cfg(可以是tar.gz)。在manifest.in中,您可以定义应该包含在包中的内容。无论如何,你可以用setup.py-like做很多事情

1
2
3
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一起使用。寻求帮助

1
python setup.py --help-commands


要安装已下载的python包,请提取存档并在其中运行setup.py脚本:

1
python setup.py install

对我来说,这总是觉得很奇怪。在下载时使用包管理器会更自然,就像在Ruby和Nodejs中那样,例如gem install rails-4.1.1.gem

包管理器也更舒适,因为它熟悉且可靠。另一方面,每个setup.py都是新颖的,因为它是特定于包的。它需要对惯例的信任,"我相信这个设置。py使用的命令和我以前使用过的其他命令相同"。这是一种令人遗憾的精神意志力税。

我并不是说setup.py工作流比包管理器更安全(我知道pip只是在内部运行setup.py),但我肯定觉得这是awkard和jarring。在同一个包管理器应用程序中,命令都是一致的。你甚至可能会喜欢它。


使用setup.py下载包时,打开终端(mac、linux)或命令提示符(windows)。使用cd并帮助您使用tab按钮,将路径设置为文件下载位置和setup.py所在的文件夹的正确路径:

1
iMac:~ user $ cd path/pakagefolderwithsetupfile/

按Enter键,您将看到如下内容:

1
iMac:pakagefolderwithsetupfile user$

然后在此之后键入python setup.py install

1
iMac:pakagefolderwithsetupfile user$ python setup.py install

enter。完成!


setup.py和其他文件一样是一个python文件。它可以使用任何名称,除非按照惯例它被命名为setup.py,这样每个脚本就没有不同的过程。

最常见的是setup.py用于安装python模块,但用于服务器其他用途:

模块:

也许这是setup.py在模块中最著名的用法。虽然可以使用pip安装它们,但默认情况下,旧的python版本不包括pip,它们需要单独安装。

如果您想安装一个模块,但不想安装pip,唯一的选择就是从setup.py文件安装模块。这可以通过python setup.py install实现。这将把python模块安装到根字典(不带pipeasy_install等)。

这种方法通常在pip失败时使用。例如,如果所需包的正确python版本无法通过pip获得,可能是因为不再维护它,下载源代码并运行python setup.py install将执行相同的操作,除非需要编译的二进制文件,(但将忽略python版本-除非返回错误)。

setup.py的另一个用途是从源代码安装包。如果某个模块仍在开发中,那么车轮文件将不可用,安装的唯一方法是直接从源代码安装。

构建python扩展:

构建模块后,可以使用distutils安装脚本将其转换为准备分发的模块。一旦构建完成,就可以使用上面的命令安装它们。

安装脚本易于构建,一旦文件配置正确,可以通过运行python setup.py build编译(有关所有命令,请参见链接)。

它又一次被命名为setup.py,以便于使用和按惯例命名,但可以取任何名称。

赛通:

setup.py文件的另一个著名用途包括编译扩展。这需要一个具有用户定义值的安装脚本。它们允许快速(但一旦编译就依赖于平台)执行。以下是文档中的一个简单示例:

1
2
3
4
5
6
7
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。这会将python脚本转换为可执行文件。这允许许多命令(如描述、名称、图标、包)包括、排除ECT,一旦运行,将生成一个可分发的应用程序。文档中的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
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将以"__main__"的形式运行。在setup.py中,您应该放置安装包所需的所有内容。

公共设置.py函数

以下两个部分讨论了许多setup.py模块具有的两个功能。

设置工具.设置

此函数允许您指定项目属性,如项目名称、版本….最重要的是,这个函数允许您安装其他功能,如果它们被正确打包的话。有关SETUPTOOLS.SETUP的示例,请参阅此网页。SETUPTOOLS.SETUP的这些属性允许安装以下类型的软件包:

  • 使用setuptools.findpackages导入到项目并在pypi中列出的包:

    埃多克斯1〔19〕

  • 包不在pypi中,但可以使用依赖项链接从URL下载

    埃多克斯1〔20〕

  • 小精灵自定义函数

    在一个理想的世界里,setuptools.setup会为你处理一切。不幸的是,情况并非总是如此。有时,您必须执行特定的操作,例如使用子进程命令安装依赖项,以使正在安装的系统处于适合您的包的正确状态。为了避免这种情况,这些函数会变得混乱,并且在操作系统和均匀分布之间经常会有所不同。