【问题标题】:What is setup.py?什么是 setup.py?
【发布时间】:2010-12-01 02:46:17
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

setup.py 是一个 python 文件,它的存在表明您要安装的模块/包可能已经使用 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 documentation on writing the Setup Script

【讨论】:

  • 该操作会自动将下载的包放入site-packages吗?
  • 轮子呢?
【解决方案3】:

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

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

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

【讨论】:

  • 可以随便调用 setup.py 吗?喜欢setup_mathmod.py
  • 是的,setup.py 只是一个约定
【解决方案4】:

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

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

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

【讨论】:

  • 所以根据上面的类比,如果由于某种原因构建模块失败,我会修改 setup.py 脚本...正确吗?
  • 是的,您可能还可以查看一些配置文件。
  • 如果我错了,请纠正我,但我相信两者之间存在细微差别。 python setup.py installactually runs python setup.py build first(因此除非在特定情况下,否则您不需要单独运行它们)。我相信make 在运行make install 之前总是需要手动运行。
  • @cheflo 实际上make 不需要任何特定参数(或排序):完全取决于Makefile 的创建者哪些“目标”可用(以及他们需要以什么顺序被调用)。由于裸Makefiles(通常)不是很便携,它们往往是使用诸如./configure(autotools)或cmake .(cmake)之类的命令生成的,因此由这些程序来定义您是否需要显式在make install 之前运行make
  • 根据docs.python.org/3/installing/index.html 的文档,我需要有人告诉我是否还应该继续使用 setup.py@“虽然直接使用 distutils 正在逐步淘汰,...”
【解决方案5】:

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 时非常有用。
【解决方案6】:

当您下载带有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。完成!

【讨论】:

    【解决方案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),但我确实觉得它很尴尬和不和谐。所有命令都指向同一个包管理器应用程序,这是一种和谐。你甚至可能会喜欢上它。

    【讨论】:

    • 然后你可以使用 easy_install 或类似的。顺便说一句,Python 有鸡蛋,有点类似于红宝石。
    【解决方案8】:

    在你的机器上安装一个python包foo(也可以在virtualenv中)会有所帮助,这样你就可以从其他项目以及[I]Python提示中导入包foo

    它的作用与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  
    

    此命令将在站点包中创建指向源目录的符号链接,而不是复制内容。正因为如此,它非常快(特别是对于大包)。


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

    long_descriptionpypi.org 中用作软件包的 README 描述。


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

    此时有两种选择。

    • 临时test.pypi.org服务器上发布,让自己熟悉程序,然后在永久pypi.org服务器上发布,供公众使用包。
    • 如果您已经熟悉该过程并拥有您的用户凭据(例如,用户名、密码、软件包名称),请立即在 永久pypi.org 服务器上发布

    一旦你的包名在pypi.org注册,任何人都不能认领或使用它。 Python packaging suggests the twine package 用于上传(您的包到 PyPi)。因此,

    (1) 第一步是在本地构建使用:

    # prereq: wheel (pip install wheel)  
    $ python setup.py sdist bdist_wheel   
    

    (2) 然后使用twine 上传到 test.pypi.org 或 pypi.org:

    $ twine upload --repository testpypi dist/*  
    username: ***  
    password: ***  
    

    包需要几分钟才能出现在 test.pypi.org 上。一旦您对它感到满意,您就可以将您的包裹上传到pypi.org 的真实永久索引,只需:

    $ twine upload dist/*  
    

    或者,您还可以使用GPG 为您的包中的文件签名:

    $ twine upload dist/* --sign 
    

    额外阅读

    【讨论】:

    • Kenneth Reitz(可敬的 requests 的作者)有这个项目明确给出了 setup.py 的一个很好的例子 -- github.com/kennethreitz/setup.py
    • 子包,即包内有模块的文件夹呢?
    • 这也处理 requirements.txt 吗?
    • @Jwan622 您可以解析requirements.txt 文件并填充一个可迭代对象,例如requirements,并将此可迭代对象requirements 分配给install_requires。请参阅此页面setup.py requirements.txt 以获取示例。
    • 安装到你的主目录:python setyp.py install --user
    【解决方案9】:

    为简单起见,当您调用install functions 提到的其他答案时,setup.py 以"__main__" 运行。在 setup.py 中,您应该放置安装包所需的所有内容。

    setup.py 常用函数

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

    setuptools.setup

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

    setuptools.setup 的这些属性可以安装这些类型的包:

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

      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 甚至 distribution 之间经常会有所不同。

    【讨论】:

      【解决方案10】:

      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 是为了便于使用和按照惯例,但可以采用任何名称。

      赛通:

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-22
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        • 2021-06-25
        • 2017-11-19
        相关资源
        最近更新 更多