翻译:《实用的Python编程》09_03_Distribution

本文介绍如何使用Python打包自己的代码供他人使用,包括创建setup.py和MANIFEST.in文件的方法,以及如何构建源码发行版和安装步骤。

目录 | 上一节 (9.2 第三方包) | 下一节 (完结)

9.3 Distribution版本分发

在某些时候,你可能想要将自己的代码提供给其他人——可能只是同事(使用)。本节给出执行此操作的最基本技术。更多详细信息,请参考 Python 打包用户指南

创建 setup.py 文件

请添加一个 setup.py 到项目目录的顶层。

# setup.py
import setuptools

setuptools.setup(
    name="porty",
    version="0.0.1",
    author="Your Name",
    author_email="you@example.com",
    description="Practical Python Code",
    packages=setuptools.find_packages(),
)

创建 MANIFEST.in 文件

如果有其它文件与你的项目相关联,请使用一个 MANIFEST.in 文件指定这些关联的文件。示例:

# MANIFEST.in
include *.csv

请将 MANIFEST.in 文件放到 setup.py 所在的目录。

创建源码发行版

要创建源码发行版,请使用 setup.py 文件。示例:

bash % python setup.py sdist

这将在 dist/ 目录中创建 .tar.gz 或者 .zip 文件。该文件就是你要提供给其他人使用的文件。

安装你的代码

其他人可以使用 pip 像安装其它软件包一样安装你的 Python 代码。他们仅仅需要提供在之前的步骤中创建的文件即可。示例:

bash % python -m pip install porty-0.0.1.tar.gz

说明

上面的步骤描述了创建 Python 代码包的最基本的知识,您可以将这些代码包提供给其他人使用。实际上,根据第三方的依赖关系,它可能要复杂得多,无论你的应用是否包含外部代码(例如 C 或 C++)。这已经超出了本课程的范围,我们只作初步了解。

练习

练习 9.5:创建软件包

使用练习 9.3 中创建的 porty-app/ 代码,看看是否可以重新创建此前描述的步骤。具体来说,添加一个 setup.py 文件和一个 MANIFEST.in 文件到顶级目录中。然后通过运行 python setup.py sdist 创建源码发行版。

最后,看看是否可以在 Python 虚拟环境中安装你的软件包。

目录 | 上一节 (9.2 第三方包) | 下一节 (完结)

注:完整翻译见 https://github.com/codists/practical-python-zh

class IntegerEdgeCases(Mutator): def __init__(self, obj, rand): Mutator.__init__(self) min_, max_ = self.get_limits(obj) delta = max_ - min_ if 0xff >= delta >= 0: # We are <= a single byte, set the space size of the range self.space = delta + 1 self.full_space = self.space def sequential(): return min_ + self.mutation_index def random(): return rand.randint(min_, max_) self.sequential_generator = sequential self.random_generator = random else: # For more than a single byte, use edge case generator self.generator = EdgeCaseGenerator(min_, max_) self.space = len(self.generator.values) self.full_space = self.generator.deviation def sequential(): return self.generator.values[self.mutation_index] def random(): return self.generator.gen_next(rand) self.sequential_generator = sequential self.random_generator = random def get_limits(self, obj): """ Get the minimum and maximum values to generate edge cases for. :param obj: The element this mutator is bound to. :return: The minimum value of the number space, The maximum value of the number space. """ return 0, sys.maxsize def perform_mutation(self, obj, value): """ Mutate the data element. :param obj: The element to mutate. :param value: The value to use when mutating. :return: """ pass def mutate(self, obj, gen): value = gen() self.perform_mutation(obj, value) def sequential_mutation(self, obj): self.mutate(obj, self.sequential_generator) def random_mutation(self, obj): self.mutate(obj, self.random_generator) def get_count(self): return self.space 以上是utils.py中的 IntegerEdgeCases类 class StringLengthEdgeCase(IntegerEdgeCases): mutated_elements = [] def __init__(self, obj, rand): super().__init__(obj, rand) def get_limits(self, obj): max_ = obj.mutator_config.max_output_size * 8 size = obj.calculate_bit_size() limit = max(max_ , size) limit = (limit + 7) // 8 max_ = limit if obj.max_length is not None: max_ = min(max_, obj.max_length) min_ = 0 if obj.min_length is not None: min_ = max(min_, obj.min_length) return min_, max_ @classmethod def supported(cls, obj): if isinstance(obj, String): return True return False def perform_mutation(self, obj, value): obj.mutated_value = expand(obj.value, value) obj.mutated = True 以上是stringlengthedgecase.py中的继承类 这个代码为我一比一翻译成cpp版本
07-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值