任何人都可以请解释一下,什么是setup.py
以及它如何进行配置或使用?
Answer 1:
setup.py
是Python文件,它通常会告诉你该模块/包你将要安装已包装和Distutils的,这是分配的Python模块标准分配。
这使您可以轻松地安装Python包。 通常它是足够写:
$ python setup.py install
并且该模块将自行安装。
https://docs.python.org/3/installing/index.html#installing-index
Answer 2:
它可以帮助安装Python包foo
你的机器上(也可以在virtualenv
),这样就可以导入的包foo
其他项目的[I] Python的提示和也。
它做的类似的工作pip
, easy_install
等等,
使用setup.py
让我们先从一些定义:
包 -文件夹/目录包含__init__.py
文件。
模块 -一个有效的Python文件.py
扩展。
分布 -一个包如何与其他包和模块 。
比方说,你要安装一个软件包名为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=['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',
]
)
添加更多的东西( 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_description
在使用pypi.org作为你的包的README描述。
最后,您现在就可以上传你的包PyPi.org以便其他人可以使用安装软件包pip install yourpackage
。
第一步是要求你的包名和空间利用的PyPI:
$ python setup.py register
一旦你的包名称被注册,没有人可以要求或使用它。 注册成功后,您必须由有上传你的软件包(云)
$ python setup.py upload
或者,你也可以用签名包GPG
通过,
$ python setup.py --sign upload
奖励 :查看示例setup.py
这里离一个真正的项目: torchvision-setup.py
Answer 3:
setup.py
是Python的答案,一个多平台的安装和make
文件。
如果你熟悉命令行安装,那么make && make install
转化为python setup.py build && python setup.py install
。
有些软件包是纯Python,并只能按字节编译。 其他人可能包含本机代码,这将需要一个本地编译器(如gcc
或cl
)和一个Python接口模块(如swig
或pyrex
)。
Answer 4:
如果你下载了有“setup.py”在根文件夹包,您可以通过运行安装
python setup.py install
如果你正在开发一个项目,但是不知道这是什么文件是有用的,检查Python文档上写的安装脚本
Answer 5:
setup.py
是通常附带库或程序,该语言编写的一个Python脚本。 它的目的就是软件的正确安装。
许多包使用distutils
中一起选择框架, setup.py
。
http://docs.python.org/distutils/
Answer 6:
setup.py可以在两种情况下使用,首先,你要安装一个Python包。 其次,你要创建自己的Python包。 通常标准的Python包有几个像setup.py,setup.cfg和Manifest.in重要文件。 当你创建的Python包,这三个文件将确定的名称,版本,描述,其他所需的设备(通常是在.txt文件)和其他一些参数(下鸡蛋信息文件夹PKG-INFO的内容)。 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
Answer 7:
当你下载一个包setup.py
打开你的终端(苹果机和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
。 完成!
Answer 8:
要安装已下载的Python包,你解压压缩包,运行里面的setup.py脚本:
python setup.py install
对我来说,这一直感到奇怪。 这将是更自然的下载点的软件包管理器,正如人们在Ruby和的NodeJS,如做。 gem install rails-4.1.1.gem
包管理更舒适也一样,因为它是熟悉和可靠。 在另一方面,每个setup.py
是新颖的,因为它是具体的包。 它要求在公约的信心:“我相信这setup.py需要为别人我在过去已经使用了相同的命令”。 这是对精神意志力一个令人遗憾的税。
我不是说了setup.py工作流程比的软件包管理器(我的理解皮普只是运行里面的setup.py)不太安全,但肯定我觉得这是awkard和不和谐。 有一个和谐的命令都被以相同的包管理器应用程序。 你甚至可能会增长喜欢它。
Answer 9:
setup.py
是像任何其他Python文件。 它可以采取任何名称,除了按照惯例它被命名为setup.py
所以不存在对每个脚本不同的过程。
最常见的setup.py
是用来安装一个Python模块,但服务器的其他用途:
模块:
也许这是最有名的使用setup.py
是模块。 虽然他们可以使用安装pip
,老Python版本不包括pip
默认情况下,他们需要单独安装。
如果你想安装的模块,但不希望安装pip
,只是唯一的选择是安装在模块setup.py
文件。 这可以通过以下方式实现python setup.py install
。 这将安装Python模块到根辞典(无pip
, easy_install
ECT)。
这种方法通常用在pip
会失败。 例如,如果所需的包的正确的Python版本是无法通过使用pip
也许是因为它不再保持,下载源和运行python setup.py install
需要将执行同样的事情,除了在编译的二进制文件的情况下, (但会忽略Python版本-unless返回一个错误)。
的另一种用途setup.py
是从源代码安装程序包。 如果模块仍处于开发阶段的车轮文件将不可用,安装唯一的办法就是直接从源代码安装。
建筑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"),
)
这可以通过编译python setup.py build
Cx_Freeze:
需要安装脚本的另一个模块是cx_Freeze
。 这Python脚本转换为可执行文件。 这让许多命令,比如描述,名称,图标包包括,排除ECT,一旦运行将产生一个分布式应用程序。 从一个示例文档 :
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包/脚本以某种方式。
它需要这么建筑或安装时相同的命令总是可以使用的名称。
Answer 10:
为简单起见,setup.py运行为"__main__"
当你调用安装功能提到的其他答案。 内部setup.py,你应该把安装软件包所需的一切。
常见setup.py功能
以下两节讨论两件事情很多setup.py模块有。
setuptools.setup
此功能允许您指定项目的属性 ,如项目名称,版本....最重要的是,这个功能可以让你如果他们妥善包装,安装等功能。 请参阅此网页为setuptools.setup的例子
setuptools.setup的这些属性使安装这些类型的包:
被导入到你的项目,并列举在包的PyPI使用setuptools.findpackages :
包= find_packages(排除= [ “文档”, “测试”, “的.gitignore”, “README.rst”, “DESCRIPTION.rst”])
包不是在PyPI中 ,但可以从使用URL下载dependency_links
dependency_links = [ “ http://peak.telecommunity.com/snapshots/ ”,]
自定义功能
在一个理想的世界, setuptools.setup
会处理一切都是为了你。 不幸的是这并非总是如此。 有时你必须做具体的事情,比如与安装依赖子命令,让你在正确的状态,你的包进行安装的系统。 尽量避免这种情况,这些功能会比较混乱,经常与不同的操作系统 ,甚至分布 。