下面是关于Python中的setup.py的完整攻略。
什么是setup.py?
setup.py
是一个Python脚本,用于描述项目的元数据,并通过调用setuptools
库来构建、打包和分发Python模块和应用程序。通常,setup.py
需要包含两个主要部分:
- 描述项目元数据的
setup()
函数调用。 - 控制Python构建和分发的命令行接口。
setup()
函数
setup()
函数是用于定义项目的元数据的Python函数。在这个函数里,你需要提供关于项目的描述信息,如名称、版本、作者、许可证、依赖项等。以下是基本的setup()
函数:
from setuptools import setup, find_packages
setup(
name='my_package',
version='0.1.0',
author='Me',
description='My Python package',
packages=find_packages(),
install_requires=[
'numpy',
'pandas'
]
)
在这里,我们使用第三方库setuptools
来导入setup()
函数。接下来我们向setup()
函数提供一些参数:
name
: 项目的名称。version
: 项目的版本号,通常遵循major.minor.patch
或major.minor.devN
的形式。author
: 项目的作者名称。description
: 项目概述。packages
: 包含模块的Python包目录。我们使用find_packages()
函数自动查找所有包。install_requires
: 项目所依赖的第三方Python包列表,这些包需要在安装或使用时自动安装。注意,这些依赖应该指定精确的版本范围,而不是使用通配符。
命令行接口
setup.py
还需要提供一些命令行接口。这些接口可以使用setuptools
提供的setup.py
脚本的cmdclass
参数来实现。以下是常见的命令行接口:
sdist
: 构建源代码分发包。bdist_wheel
: 构建Python whl二进制包。bdist
: 构建二进制tar包。install
: 安装Python模块。dev
: 安装开发版本(例如包括源代码)。
你可以通过定义一个继承自setuptools.Command
的子类,并重写run()
函数来实现这些命令行接口。
from setuptools import setup, find_packages
from setuptools.command.install import install
class CustomInstallCommand(install):
def run(self):
print("Custom install command")
install.run(self)
setup(
name='my_package',
version='0.1.0',
author='Me',
description='My Python package',
packages=find_packages(),
install_requires=[
'numpy',
'pandas'
],
cmdclass={
'install': CustomInstallCommand
}
)
在这里,我们创建了一个自定义的安装命令行接口,并将它指定为install
命令的子命令。我们的CustomInstallCommand
类将打印一条自定义消息,然后继续执行默认的安装过程。
示例
以下是两个基于setup.py
的示例:
示例一:Python模块
首先,我们来看一个应用setup.py
来构建Python模块的示例。假设我们的项目名为my_module
,包含以下文件:
my_module/
__init__.py
module_a.py
module_b.py
setup.py
my_module/__init__.py
内容:
from .module_a import *
from .module_b import *
my_module/module_a.py
内容:
def foo():
print("Hello from foo")
my_module/module_b.py
内容:
def bar():
print("Hello from bar")
接下来,我们定义setup()
函数:
from setuptools import setup, find_packages
setup(
name='my_module',
version='0.1.0',
author='Me',
description='My Python module',
packages=find_packages(),
install_requires=[
'numpy',
'pandas'
]
)
在这里,我们使用了find_packages()
函数自动查找所有包。install_requires
参数指定了该模块所依赖的第三方包。这些依赖将在安装或使用时自动安装。
最后,我们可以使用以下命令来构建和分发模块:
$ python setup.py sdist bdist_wheel
这将在dist
目录下生成一个源代码分发包和一个whl二进制包。
要安装我们的模块,只需要运行以下命令:
$ pip install .
就可以在Python中使用我们的模块了:
import my_module
my_module.foo() # Hello from foo
my_module.bar() # Hello from bar
示例二:Python应用程序
我们也可以使用setup.py
来构建Python应用程序。我们来看一个简单的Python应用程序示例,它将读取一个名为data.csv
的CSV文件,计算每列的平均值,并将结果输出到控制台。
首先,我们需要创建以下文件结构:
my_app/
__init__.py
app.py
data.csv
setup.py
my_app/__init__.py
可以留空。
my_app/app.py
:
import csv
import pandas as pd
import sys
from pathlib import Path
def main():
filename = Path(__file__).parent / 'data.csv'
with open(filename, 'r') as f:
reader = csv.reader(f)
headers = next(reader)
data = pd.DataFrame(reader, columns=headers)
means = data.mean()
for col, mean in means.items():
print(f"{col}: {mean:.2f}")
if __name__ == '__main__':
main()
在这里,我们使用了pandas
来读取CSV文件,并计算每列的平均值。最后,将结果输出到控制台。
接下来,我们定义setup()
函数:
from setuptools import setup
setup(
name='my_app',
version='0.1.0',
author='Me',
description='My Python app',
py_modules=['app'],
install_requires=[
'pandas'
],
entry_points={
'console_scripts': [
'my_app=app:main'
]
}
)
在这里,我们使用了py_modules
参数来指定我们的主Python模块是app.py
。entry_points
参数允许我们在安装时将app.main()
函数提供给命令行运行。
最后,我们可以使用以下命令构建和安装应用:
$ python setup.py sdist bdist_wheel
$ pip install .
安装完成后,我们可以在命令行中运行我们的应用:
$ my_app
这将读取data.csv
文件,并输出每列的平均值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于python中的setup.py - Python技术站