什么是setup.py?

Sof*_*tic 869 python pypi setup.py python-3.x python-packaging

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

Sil*_*rom 593

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

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

$ pip install . 
Run Code Online (Sandbox Code Playgroud)

并且模块将自行安装.

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

  • 如果您分享有关如何创建或处理此模块的知识,我将不胜感激?例如,如何创建基本模块,或如何测试./mymodule/bin上从./mymodule/libs/导入的脚本 (7认同)
  • @PauloOliveira参见描述Distutils的[Distributing Python Modules](https://docs.python.org/2/distutils/index.html),特别是[2.编写安装脚本](https://docs.python.org/2/distutils/setupscript.html). (7认同)
  • 切勿使用python setup.py安装!它破坏了您的版本控制!http://stackoverflow.com/questions/4324558/whats-the-proper-way-to-install-pip-virtualenv-and-distribute-for-python (4认同)
  • 您可以将链接更改为https://docs.python.org/3/installing/index.html,这是非旧版文档链接,并且最好将链接添加到https:// packaging。 python.org/tutorials/distributing-packages/#setup-py,其中说明了`setup.py`文件的用途。 (3认同)
  • 我不确定@MikeS的解决方法是什么,但是我可以告诉您,运行setup.py导致我遇到了需要花费大量时间进行清理的噩梦问题。我猜想用pip或conda构建/捆绑是解决方案。 (2认同)
  • @YuriFeldman 应该注意的是,即使是自定义库也可以内置到wheel文件中,这些文件可以通过pip安装。(我知道这一点是因为我在工作中就是这样做的)。 (2认同)

kma*_*o23 401

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

它做类似的工作pip,easy_install等等,


运用 setup.py

让我们从一些定义开始:

- 包含__init__.py文件的文件夹/目录.
模块 - 具有.py扩展名的有效python文件.
分发 - 一个与其他模块的关系.

假设您要安装名为的软件包foo.那你呢,

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)

相反,如果您不想实际安装它但仍想使用它.然后做,

$ python setup.py develop  
Run Code Online (Sandbox Code Playgroud)

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


创建 setup.py

如果你有你的包树,

foo
??? foo
?   ??? data_struct.py
?   ??? __init__.py
?   ??? internals.py
??? README
??? requirements.txt
??? setup.py
Run Code Online (Sandbox Code Playgroud)

然后,在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
)
Run Code Online (Sandbox Code Playgroud)

相反,如果您的包树更复杂,如下所示:

foo
??? foo
?   ??? data_struct.py
?   ??? __init__.py
?   ??? internals.py
??? README
??? requirements.txt
??? scripts
?   ??? cool
?   ??? skype
??? setup.py
Run Code Online (Sandbox Code Playgroud)

那么,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',
           ]
)
Run Code Online (Sandbox Code Playgroud)

添加更多东西给(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',
           ]
)
Run Code Online (Sandbox Code Playgroud)

long_descriptionpypi.org中用作包的README描述.


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

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

$ python setup.py register
Run Code Online (Sandbox Code Playgroud)

一旦您的包裹名称被注册,没有人可以声明或使用它.注册成功后,您必须将包裹上传到云端(到云端),

$ python setup.py upload
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用GPG,

$ python setup.py --sign upload
Run Code Online (Sandbox Code Playgroud)

额外奖励:请setup.py在此处查看实际项目中的示例:torchvision-setup.py

  • Kenneth Reitz(古老的`requests`的作者)有这个项目明确给出了setup.py的一个很好的例子 - https://github.com/kennethreitz/setup.py (8认同)

wha*_*ick 92

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

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

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

  • @cheflo实际上`make`不需要任何特定的参数(或排序):完全取决于`Makefile`的创建者,"目标"是可用的(以及它们需要被调用的顺序).由于裸`Makefile`s(通常)不是很便携,他们往往使用诸如`命令生成/ configure`(自动工具)或'cmake的.`(CMake的),它是为此多达这些程序来定义是否你需要在`make install`之前显式运行`make`. (6认同)
  • 如果我错了,请纠正我,但我相信两者之间存在细微差别.`python setup.py install` [实际上首先运行`python setup.py build`](https://docs.python.org/2/install/index.html#splitting-the-job-up)(所以你不要除非在特定情况下,否则需要单独运行它们.我相信`make`总是需要在运行`make install`之前手动运行. (3认同)
  • 根据https://docs.python.org/3/installing/index.html上的文档,我需要一个人告诉我是否仍然应该使用setup.py"直到使用distutils正在逐步淘汰,......" (3认同)

Pēt*_*une 48

如果您下载了根文件夹中包含"setup.py"的软件包,则可以通过运行来安装它

python setup.py install
Run Code Online (Sandbox Code Playgroud)

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


Fer*_*yer 18

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

许多软件包都使用distutils框架setup.py.

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


Avi*_*aya 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)
Run Code Online (Sandbox Code Playgroud)

还有许多其他命令可以与setup.py一起使用.求助

python setup.py --help-commands
Run Code Online (Sandbox Code Playgroud)


G M*_*G M 7

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

iMac:~ user $ cd path/pakagefolderwithsetupfile/
Run Code Online (Sandbox Code Playgroud)

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

iMac:pakagefolderwithsetupfile user$
Run Code Online (Sandbox Code Playgroud)

然后输入python setup.py install:

iMac:pakagefolderwithsetupfile user$ python setup.py install
Run Code Online (Sandbox Code Playgroud)

enter.完成!


Col*_*nic 7

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

python setup.py install
Run Code Online (Sandbox Code Playgroud)

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

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

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


use*_*074 7

为简单起见,setup.py"__main__"在您调用其他答案提到的安装函数时运行。在 setup.py 中,您应该放置安装包所需的一切。

常用 setup.py 函数

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

设置工具.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甚至发行版之间经常有所不同。


Sim*_*mon 6

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

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

模块:

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

如果要安装模块但不想安装pip,则唯一的选择是从setup.py文件安装模块。这可以通过完成python setup.py install。这将Python模块安装到根字典(不pipeasy_installECT)。

pip失败时通常使用此方法。例如,如果pip可能由于不再维护所需软件包的正确Python版本而无法提供该软件包,则下载源文件并运行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"),
)
Run Code Online (Sandbox Code Playgroud)

这可以通过编译 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)])
Run Code Online (Sandbox Code Playgroud)

可以通过编译python setup.py build

那么什么是setup.py文件?

很简单,它是一个在Python环境中构建或配置某些东西的脚本。

分发时,程序包应仅包含一个安装脚本,但将多个脚本组合成一个安装脚本并不少见。请注意,这经常涉及distutils但并非总是如此(如我在上一个示例中所示)。要记住的事情是以某种方式配置Python包/脚本。

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


归档时间:

查看次数:

517160 次

最近记录:

6 年,3 月 前