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


#1楼

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

这使您可以轻松安装Python软件包。 通常写就足够了:

$ pip install .

pip将使用setup.py安装模块。 避免直接调用setup.py 。

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


#2楼

如果您下载的软件包在根文件夹中具有“ setup.py”,则可以通过运行以下命令进行安装

python setup.py install

如果您正在开发项目,并且想知道此文件的用途,请查看有关编写安装脚本的Python文档。


#3楼

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

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

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


#4楼

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

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

一些软件包是纯Python,并且仅按字节编译。 其他可能包含本机代码,这将需要本机编译器(如gcc或cl )和Python接口模块(如swig或pyrex )。


#5楼

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

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

iMac:~ user $ cd path/pakagefolderwithsetupfile/

按Enter键,您应该会看到类似以下内容:

iMac:pakagefolderwithsetupfile user$

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

iMac:pakagefolderwithsetupfile user$ python setup.py install

按enter 。 做完了!


#7楼

要安装已下载的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),但是我肯定觉得这很麻烦。 将所有命令都发送到同一个程序包管理器应用程序是一种和谐。 您甚至可能会喜欢它。


#8楼

它有助于在计算机上安装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.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_description中, long_description用作软件包的自述文件描述。


最后,您现在可以将软件包上传到PyPi.org,以便其他人可以使用pip install yourpackage来pip install yourpackage 。

第一步是使用以下方法在pypi中声明您的软件包名称和空间:

$ python setup.py register

注册您的包裹名称后,任何人都无法声明或使用它。 成功注册后,您必须通过以下方式将软件包上传到云(到云):

$ python setup.py upload

您也可以选择通过以下方式使用GPG对包裹进行签名:

$ python setup.py --sign upload

奖励 :查看示例setup.py这里离一个真正的项目: torchvision-setup.py


#9楼

为简单"__main__"当您调用安装函数并提到其他答案时,setup.py将以"__main__"运行。 在setup.py内部,应该放置安装软件包所需的一切。

常用的setup.py功能

以下两节讨论了许多setup.py模块具有的两件事。

setuptools.setup

此功能允许您指定项目属性,例如项目名称,版本。...最重要的是,如果其他功能打包正确,此功能将允许您安装其他功能。 请参阅此网页以获取setuptools.setup的示例。 使用setuptools.setup的这些属性可以安装以下类型的软件包:

  • 使用setuptools.findpackages导入到项目并在PyPI中列出的软件包 : packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])
  • 软件包不在PyPI中 ,但可以使用dependency_links从URL下载 dependency_links=["http://peak.telecommunity.com/snapshots/",]

自定义功能

在理想的情况下, setuptools.setup将为您处理所有事情。 不幸的是,情况并非总是如此。 有时,您需要做一些特定的事情,例如使用subprocess命令安装依赖项,以使要安装的系统处于正确的软件包状态。 尝试避免这种情况,这些功能会造成混乱,并且在OS甚至发行版之间通常会有所不同。


#10楼

setup.py是一个与其他文件一样的Python文件。 它可以采用任何名称,除非按照惯例将其命名为setup.py以便每个脚本没有不同的过程。

最常用的setup.py用于安装Python模块,但用于服务器其他目的:

模块:

也许这是setup.py最著名的用法在模块中。 尽管可以使用pip进行安装,但默认情况下,旧的Python版本不包含pip ,因此需要单独安装。

如果您想安装模块但不想安装pip ,则唯一的选择是从setup.py文件安装模块。 这可以通过python setup.py install来实现。 这会将Python模块安装到根字典(不带pip , easy_install ect)。

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

setup.py另一个用途是从源代码安装软件包。 如果模块仍在开发中,则将无法使用wheel文件,并且唯一的安装方法是直接从源代码进行安装。

构建Python扩展:

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

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

为了易于使用并按照惯例,它再次被命名为setup.py ,但是可以使用任何名称。

Cython:

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

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脚本转换为可执行文件。 这允许包括描述,名称,图标,软件包在内的许多命令包括,排除等,并且一旦运行将产生可分发的应用程序。 文档中的示例:

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包/脚本。

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