1343

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

4

10 回答 10

974

setup.py是一个 python 文件,它的存在表明您将要安装的模块/包可能已经使用 Distutils 打包和分发,这是分发 Python 模块的标准。

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

$ pip install . 

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

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

于 2009-09-24T14:19:35.300 回答
689

它有助于foo在您的机器上安装一个 python 包(也可以在 中virtualenv),以便您可以foo从其他项目以及 [I]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  

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


创造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',
           ]
)

pypi.orglong_description中用作包的 README 描述。


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

此时有两种选择。

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

一旦您的包名称在pypi.org中注册,任何人都无法声明或使用它。Python 打包建议使用twine进行上传(将包上传到 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 

额外阅读

于 2016-10-01T22:04:48.880 回答
120

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

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

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

于 2009-09-24T15:29:09.360 回答
63

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

python setup.py install

如果您正在开发一个项目并且想知道这个文件有什么用,请查看Python 文档以编写安装脚本

于 2009-09-24T14:21:46.973 回答
24

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

许多包将distutils框架与setup.py.

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

于 2009-09-24T14:21:58.963 回答
21

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
于 2013-04-18T16:29:38.233 回答
12

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

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

模块:

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

如果您想安装模块但不想安装pip,那么唯一的选择就是从setup.py文件中安装模块。这可以通过python setup.py install. 这会将 Python 模块安装到根字典(没有pip, 等easy_install)。

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

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

构建 Python 扩展:

构建模块后,可以使用distutils 设置脚本将其转换为准备分发的模块。构建后,可以使用上面的命令安装这些。

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

再次,它被命名setup.py为易于使用和约定,但可以采用任何名称。

赛通:

文件的另一个著名用途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 包/脚本。

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

于 2018-03-14T00:31:10.650 回答
8

当您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。完毕!

于 2013-09-18T10:49:14.733 回答
7

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

常用 setup.py 函数

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

安装工具.setup

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

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

自定义函数

在一个理想的世界里,setuptools.setup会为你处理一切。不幸的是,情况并非总是如此。有时您必须做一些特定的事情,例如使用subprocess命令安装依赖项,以使您正在安装的系统处于适合您的包的状态。尽量避免这种情况,这些功能会让人感到困惑,并且在OS甚至发行版之间经常会有所不同。

于 2018-02-15T16:06:29.737 回答
6

要安装您下载的 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),但我当然觉得它很尴尬和不和谐。所有命令都指向同一个包管理器应用程序,这是一种和谐。你甚至可能会喜欢它。

于 2014-06-02T15:52:36.143 回答