ChatGPT解决这个技术问题 Extra ChatGPT

什么是 setup.py?

什么是 setup.py,如何配置或使用它?

埃里克:更好的例子把所有东西放在一起会是有益的
对我来说,如何安装解压包并在其中运行脚本,而不是让包管理器指向你下载的内容,这总是让人感到奇怪。那会更自然。 stackoverflow.com/questions/1471994/what-is-setup-py/…
查看 this official documentation 链接,此处解释清楚
根据@SwapnilMasurekar 共享的链接,似乎不再需要 setup.py 。 “setup.py 曾经是必需的,但可以在较新版本的 setuptools 和 pip 中省略。”

i
iono

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

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

$ pip install . 

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

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


如果您分享有关如何创建或处理此模块的知识,我将不胜感激?例如,如何创建一个基本模块,或者如何在 ./mymodule/bin 上测试从 ./mymodule/libs/ 导入的脚本
@PauloOliveira 请参阅描述 Distutils 的 Distributing Python Modules,特别是查看 2. Writing the Setup Script
永远不要使用 python setup.py 安装!它破坏了您的版本控制! stackoverflow.com/questions/4324558/…
@MikeS我不确定解决方法是什么,但我可以告诉你,运行 setup.py 导致我遇到需要数小时清理的噩梦问题。我猜用 pip 或 conda 构建/捆绑将是解决方案。
您可以将链接更改为 docs.python.org/3/installing/index.html,它是非旧文档链接,并且最好添加一个指向 packaging.python.org/tutorials/distributing-packages/#setup-py 的链接,以说明 setup.py 文件的用途。
N
Neuron

它有助于在您的机器上安装一个 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.example',
   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.example',
   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.example',
   url="http://www.foopackage.example/",
   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)。因此,

第一步是使用以下命令在本地构建发行版: # prereq: wheel (pip install wheel) $ python setup.py sdist bdist_wheel 然后使用 twine 上传到 test.pypi.org 或 pypi.org: $ twine upload --repository testpypi dist/* 用户名:*** 密码:***

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

$ twine upload dist/*

或者,您还可以通过以下方式使用 GPG 对包中的文件进行签名:

$ twine upload dist/* --sign

额外阅读:

在此处查看来自真实项目的示例 setup.py:torchvision-setup.py

PEP 517,设置工具

为什么要缠绕?使用麻线


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
Z
Zearin

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

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

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


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

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

python setup.py install

如果您正在开发一个项目并且想知道这个文件有什么用处,请检查 Python documentation on writing the Setup Script


该操作是否会自动将下载的包放入 site-packages 中?
轮子呢?
F
Ferdinand Beyer

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

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

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


可以随便调用 setup.py 吗?喜欢setup_mathmod.py
是的,setup.py 只是一个约定
m
malana

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 时非常有用。
X
Xantium

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

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


G
G M

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


m
mikeLundquist

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

常用 setup.py 函数

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

安装工具.setup

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

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

使用 setuptools.findpackages 导入项目并在 PyPI 中列出的包: packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

不在 PyPI 中的包,但可以使用 dependency_links dependency_links=["http://peak.telecommunity.com/snapshots/",] 从 URL 下载

自定义函数

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


C
Colonel Panic

要安装您下载的 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 有鸡蛋,有点类似于红宝石。