首页 文章

什么是setup.py?

提问于
浏览
647

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

10 回答

  • 75

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

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

    $ python setup.py install
    

    并且模块将自行安装 .

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

  • 442

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

    It does the similar job of pip, easy_install etc.,


    Using setup.py

    让我们从一些定义开始:

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

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

    $ git clone https://github.com/user/foo  
    $ cd foo
    $ python setup.py install
    

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

    $ python setup.py develop
    

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


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

    Add more stuff to (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中用作包的README描述 .


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

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

    $ python setup.py register
    

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

    $ python setup.py upload
    

    或者,您也可以使用 GPG 来签署您的包裹,

    $ python setup.py --sign upload
    

    Bonus :从这里的实际项目中查看示例 setup.pytorchvision-setup.py

  • 6

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

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

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

  • 6

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

    python setup.py install
    

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

  • 216

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

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

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

  • 16

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

    下载包含 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 . 完成!

  • 0

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

    python setup.py install
    

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

    包管理器也更舒适,因为它熟悉且可靠 . 另一方面,每个 setup.py 都是新颖的,因为它对精神意志力征税是令人遗憾的 .

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

  • 43

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

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

    Modules:

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

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

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

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

    Building Python extensions:

    构建模块后,可以使用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 编译 .

    So what is a setup.py file?

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

    分发时的程序包应该只包含一个安装脚本,但将多个程序组合在一起构成一个安装脚本并不罕见 . 请注意,这通常涉及 distutils 但并不总是(正如我在上一个例子中所示) . 要记住它只是以某种方式配置Python包/脚本 .

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

  • 1

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

    常见的setup.py函数

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

    setuptools.setup

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

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

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

    dependency_links = [“http://peak.telecommunity.com/snapshots/”,]

    自定义功能

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

相关问题