什么是setup.py?

时间:2009-09-24 14:16:53

标签: python python-3.x setup.py pypi python-packaging

任何人都可以解释一下,setup.py是什么以及如何配置或使用它?

10 个答案:

答案 0 :(得分:504)

setup.py是一个python文件,它通常告诉您要安装的模块/包已经与Distutils一起打包和分发,这是分发Python模块的标准。

这使您可以轻松安装Python包。通常它写得足够​​:

$ python setup.py install

并且模块将自行安装。

https://docs.python.org/3/installing/index.html#installing-index

答案 1 :(得分:314)

有助于在您的计算机上安装python包foo(也可以在virtualenv中),以便您可以从其他项目以及[I]导入包foo Python提示。

它执行pipeasy_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  

此命令将为si​​te-packages中的源目录创建符号链接,而不是复制内容。因此,它非常快(特别是对于大型包装)。

创建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.com',
   packages=['foo'],  #same as name
   install_requires=['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.com',
   packages=['foo'],  #same as name
   install_requires=['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.com',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

long_descriptionpypi.org中用作您的包的自述文件说明。

最后,您现在已准备好将您的软件包上传到PyPi.org,以便其他人可以使用pip install yourpackage安装您的软件包。

第一步是申请您的包裹名称& pypi中的空间使用:

$ python setup.py register

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

将包裹上传到云端(到云端)
$ python setup.py upload

或者,您也可以使用GPG by,

在包裹上签名
$ python setup.py --sign upload

奖金:在此处查看真实项目中的示例 setup.py torchvision-setup.py

答案 2 :(得分:85)

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

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

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

答案 3 :(得分:45)

如果您下载了根文件夹中包含“setup.py”的软件包,则可以通过运行

进行安装
python setup.py install

如果您正在开发项目并想知道此文件的用途,请查看Python documentation on writing the Setup Script

答案 4 :(得分:18)

setup.py是一个Python脚本,通常附带有用该语言编写的库或程序。它的目的是正确安装软件。

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

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

答案 5 :(得分:17)

setup.py可以在两种情况下使用,首先,您要安装Python包。其次,您要创建自己的Python包。通常,标准Python包有几个重要文件,如setup.py,setup.cfg和Manifest.in。在创建Python包时,这三个文件将确定(egg-info文件夹下的PKG-INFO中的内容)名称,版本,描述,其他所需安装(通常在.txt文件中)和其他一些参数。 setupC创建包时,setup.cf读取setup.cfg(可能是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

答案 6 :(得分:7)

下载包含setup.py的软件包时,请打开终端(Mac,Linux)或命令提示符(Windows)。使用cd并帮助您使用标签按钮将路径设置为您已下载文件的文件夹以及setup.py的位置:

iMac:~ user $ cd path/pakagefolderwithsetupfile/

按回车键,您应该看到如下内容:

iMac:pakagefolderwithsetupfile user$

然后在此python setup.py install之后输入:

iMac:pakagefolderwithsetupfile user$ python setup.py install

enter。完成!

答案 7 :(得分:7)

要安装已下载的Python软件包,您需要解压缩存档并运行setup.py脚本:

python setup.py install

对我来说,这总是让人感到奇怪。将包管理器指向下载是更自然的,就像在Ruby和Nodejs中那样,例如。 gem install rails-4.1.1.gem

包管理员也更舒服,因为它熟悉且可靠。另一方面,每个setup.py都是新颖的,因为它是特定于包装的。它需要对常规的信任&#34;我相信这个setup.py采用与我过去使用的其他命令相同的命令#34;。这是对精神意志力的令人遗憾的税收。

我并不是说setup.py工作流程不如包管理器安全(我理解Pip只运行setup.py),但我觉得它很尴尬和不和谐。对于同一个包管理器应用程序,所有命令都是和谐的。你甚至可能喜欢它。

答案 8 :(得分:4)

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 setup script将其转换为模块,以便分发。构建完成后,可以使用上面的命令安装它们。

设置脚本很容易构建,文件配置正确后可以通过运行python setup.py build进行编译(参见所有命令的链接)。

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

<强>用Cython:

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脚本转换为可执行文件。这允许包括描述,名称,图标,包等许多命令,排除ect,一旦运行将生成可分发的应用程序。 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包/脚本。

它采用名称,因此在构建或安装时始终可以使用相同的命令。

答案 9 :(得分:3)

为简单起见,当您调用install functions提到的其他答案时,setup.py将以readLine()运行。在setup.py中,您应该放置安装包所需的一切。

常见的setup.py函数

以下两节讨论了许多setup.py模块的两个问题。

setuptools.setup

此功能允许您指定project attributes,如项目名称,版本....最重要的是,此功能允许您在正确打包时安装其他功能。有关setuptools.setup的示例,请参阅this webpage

setuptools.setup的这些属性允许安装这些类型的包:

  • 导入到您的项目并使用PyPIsetuptools.findpackages中列出的软件包:

    "__main__"

  • 包不在PyPI中,但可以使用dependency_links从网址下载

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

自定义功能

在理想的世界中,dependency_links=["http://peak.telecommunity.com/snapshots/",]会为你处理一切。不幸的是,并非总是如此。有时您必须执行特定的操作,例如使用subprocess命令安装依赖项,以使您正在安装的系统处于适合您的软件包的状态。尽量避免这种情况,这些功能会让人感到困惑,并且OS甚至distribution之间通常会有所不同。