- 博客(342)
- 资源 (24)
- 收藏
- 关注
原创 Docker BuildKit
构建 Docker 镜像可能会很慢,而且 Docker 的构建系统还缺少一些关键的安全特性,特别是在不泄露机密信息的情况下使用构建机密的能力。在经典的 Docker 中,构建的每个步骤都会生成一个新的镜像,可以通过构建输出中报告的 ID 访问。环境变量,以确保使用 BuildKit(在 Linux 上从 23.0 版本开始,以及在足够新的 Windows/macOS Docker Desktop 安装中,这是不必要的)。这里我特指的是仅在构建镜像时需要的机密信息,而不是运行中的应用程序使用的机密信息。
2025-06-03 10:43:33
15
原创 CI中Docker构建及测试
如果你在像 GitHub Actions 这样的持续集成(CI)系统中使用临时运行器来构建 Docker 镜像(每次构建都会启动一个新的环境),默认情况下,你的构建速度会格外缓慢。在更复杂的情况下,你可能会使用 Docker Compose 来启动一些依赖服务,但一般来说,你的目标是进行最基本的测试,以证明你的镜像没有完全损坏。如果你根本没有端到端测试,并且在 Docker 镜像构建完成后立即部署,那么当你创建了一个损坏的镜像时,很可能会导致生产环境出现故障。为了实现这一点,你必须添加一个额外的标志。
2025-05-26 10:33:59
22
原创 conda-pack和conda-lock
当你想升级时,你重新生成锁定文件,由于你从版本化的直接依赖项列表开始,希望依赖项的依赖项的变化不会太糟糕。例如,如果你这次安装了 NumPy 1.19,下次安装时你可能会得到 NumPy 1.20,理论上它可能有一个错误,会改变 Pandas 的结果。如果你必须重新创建环境,它将安装最新版本的 Pandas:你可能会得到不同的结果,或者你的代码可能根本无法运行。现在,我们可以注意到,每次使用这个锁定的依赖项文件创建新环境时,你都会安装完全相同的包。,其中包含所有依赖项的确切版本,包括依赖项的依赖项。
2025-05-19 10:27:41
28
原创 Dockerfile中激活虚拟环境
Conda 会安装一个基础环境,它自身就安装在这个环境中,因此要使用基于 Conda 的应用程序,你需要创建并激活一个新的、特定于应用程序的环境。你使用的软件可能比你想象的更简单(或者更单纯),只需付出一点努力,你可能就会想出更优雅的解决方案。在这种情况下,我们只有两处重复,但在更复杂的情况下,你需要反复这样做。因此,我们可以设置 bash 配置以激活我们的环境,并且对于入口点,我们可以运行一个执行激活操作的 shell 脚本。基本上,这意味着如果你使用未定义的变量或程序失败,脚本将停止,这正是你想要的。
2025-05-12 10:26:13
57
原创 Docker安全扫描
如果这是你的默认基础镜像(大多数非 Alpine 基础的官方 Docker 镜像都是如此),那么你所有的镜像都会被标记为不安全。确实,机密信息会被泄露,但由于它在 5 分钟后过期,只要你确保在截止日期之前没有人可以访问你的镜像,泄露令牌就不是问题。随着时间的推移,Debian会为各种包含的软件包发布安全更新,你需要确保你的镜像包含这些修复。在完整的输出中,每个警告都会指向出现问题的具体代码行。并且,正如我们期望在CI中运行的工具那样,发现安全问题时退出代码为1,这通常会使你的构建运行器判定构建失败。
2025-05-06 11:21:37
54
1
原创 Docker镜像的安全性
我发现了各种各样的机密信息,例如 200 多个 AWS 账户(其中 64 个仍然有效,14 个是根账户)、1500 多个有效的 SSH 密钥、Azure 密钥、多个数据库、.npmrc 令牌、Docker Hub 账户、PyPI 存储库密钥、许多 SMTP 服务器、reCAPTCHA 机密信息、Twitter API 密钥、Jira 密钥、Slack 密钥等等。无论是运行时的机密信息、构建时的机密信息,还是你误放在错误位置的一些随机无关凭证,在机密信息泄露方面,Docker 都能“帮上忙”。
2025-04-30 13:48:11
45
原创 Docker系统包精简及安全性(防范提权攻击)
否则,删除的文件在最新层中会消失,但不会从之前的层中删除,这就像在最新的 Git 提交中删除一个文件并不会从之前的提交中删除它一样。在某些环境中,你可能无法进行这种级别的控制,但如果你直接使用 Docker 或使用 Kubernetes,你可以明确地添加或删除权限。首先,这意味着运行的进程拥有的权限较少,也就是说,如果该进程在某种程度上被远程攻击,攻击者将更难突破容器的限制。特别是,如果你需要安装编译器,你可以使用。为了避免这些问题,你需要只安装你真正需要的包,并在安装完成后清理不必要的文件。
2025-04-27 10:34:47
29
原创 Python打包及依赖
如果你的依赖项今天和昨天相同,那么任何问题都纯粹是由于代码的变化引起的。虽然安全更新和其他关键错误修复确实需要你更新依赖项,但它们也是容易处理的情况:通常维护者会将这些修复反向移植到稳定版本中,因此你不需要对代码进行太多更改。这尤其危险,因为你脚下的很多东西都在变化,而且成本也特别高,因为如果你在更改每一个依赖项,找出问题的来源可能会很困难。如果你使用 Python 的内置 TLS 支持,通常使用的是 Linux 发行版提供的 OpenSSL。测试新的依赖项并切换到新的 API 是有成本的。
2025-04-24 10:10:06
125
原创 升级Python,停用CentOS8
当然,未来总会有新的 bug 修复版本,但由于主要版本之间有 12 个月的间隔,会有大量新代码被编写出来,但没有得到广泛使用。短期内,你的最低目标是切换到一个可以使用你的依赖库的维护版本的 Python 版本。例如,如果你依赖 Pandas,如我们所见,最后一个兼容 Python 3.9 的版本是在 2023 年 6 月发布的。所以,你迟早都要进行升级。如果你使用的是一个已经有 5 年历史的 Python 版本,切换版本就会成为一件大事 —— 你通常会同时面临 Python 和库中更显著的跨版本变化。
2025-04-21 14:05:16
53
原创 Python Docker 构建
所以是的,你可以得到一个与基于 slim 的镜像大小相近的镜像,但使用 Alpine Linux 的整个动机是更小的镜像和更快的构建。通过足够的工作,你可能能够得到一个更小的镜像,但你仍然要忍受 1500 秒的构建时间,而使用。除非你想要大大减慢的构建时间、更大的镜像、更多的工作以及潜在的难以察觉的错误,否则你应该避免使用 Alpine Linux 作为基础镜像。的 Python 应用程序。但如果你的构建是可重现的,相同的输入会产生相同的输出,那么你的新镜像将与旧镜像大致相同:唯一的区别将是错误修复。
2025-04-14 10:48:04
58
5
原创 pip升级和PEP668的问题
专注于稳定性的 Linux 发行版与编写代码的开发人员有不同的情况,而开发人员又与打包代码的开发人员或安装工具的开发人员有不同的情况。有多种解决方案可以解决这个问题。这意味着你的代码无法在较旧版本的 glibc 上运行,即在较旧的 Linux 发行版上运行。如果你希望代码可重复运行,这很糟糕:你现在安装并导入了一个特定版本的 Python YAML 库,可能与你的代码期望的版本不匹配。如果你想安装用 Python 编写的应用程序,你可以直接安装 Linux 发行版提供的版本,例如在 Ubuntu 上使用。
2025-04-09 09:56:14
329
原创 为你的 Python 选择 Docker 镜像
大多数 Docker 镜像并非从头开始构建。相反,你会使用一个现有的镜像,并在 Dockerfile 中使用FROMDocker 有一系列基于各种 Linux 发行版的“官方” Docker 基础镜像,还有打包特定编程语言(特别是 Python)的基础镜像。
2025-03-31 10:56:03
366
原创 Docker打包基础2
如果你使用的是像虚拟环境(virtualenv)或 Conda 环境这样的隔离环境,那么情况与上述类似:你有两个不同版本的 Python,即系统 Python 和隔离环境中的 Python。在某些版本的 Docker 中,你可以访问这个临时镜像,但在新的且大多有所改进的 BuildKit 构建系统中却不行。在理解镜像的构建方式方面很有用,偶尔也能让你了解到不安全的设置,但它最有用的地方是找出镜像过大的原因。命令更有用的工具了。命令都能让你窥探任何镜像的内部结构,让你看到好的、坏的和丑陋的方面。
2025-03-28 10:23:48
349
原创 测试-慢服务快速测试:为何应选用已验证的模拟对象
为了让 FakeTwitterClient 成为一个可信的验证假体,你需要编写一套额外的测试,这套测试需同时针对 TwitterClient 和 FakeTwitterClient 运行。经过验证的仿制品能更确保你的测试确实在检验你所设想的内容,因为测试替身已被证实能像真实对象一样运作。如果无法在合约验证测试中触发某个边缘情况,那么针对该边缘情况,您就没有一个经过验证的模拟方案。若想在 MessageService 测试中触发这些错误,最佳做法是采用常规的测试替身策略,使用未经验证的假对象或模拟对象。
2025-03-26 09:17:41
907
原创 测试-当您的 CI 在 AWS 上耗时过长时,问题可能出在 EBS 上
几个并发的 CI 运行可能会耗尽你所有的突发 IOPS—— 如果你有一个 100GiB 的硬盘,你的 IOPS 会突然从 3000 降至 100。突发 IOPS 的运作机制是,您会获得 540 万信用额度,该额度以每秒 3000 的速度被消耗。例如,500GiB 将提供 1500 IOPS,相比 100GiB 时的 300 IOPS,这是一个更为合理的最低值。您可以转而使用本地实例存储。您可以切换至 io1 类型的 EBS 卷,它具备可配置的专用 IOPS,但仅为了运行测试,可能不值得承担这一额外成本。
2025-03-26 09:16:54
579
原创 Docker打包基础1
但由于这是一个不同的网络命名空间,这些接口与我们上面看到的默认命名空间中的接口不同。,它将从 Docker 守护进程运行的所有接口(就我们的目的而言,即主网络命名空间)转发到容器的外部 IP 地址。我们特别选择端口 5000 是因为我们的 Docker 镜像监听该端口,这是 Flask 的默认端口。将把主网络命名空间中所有接口上的端口 8080 的流量重定向到容器外部接口的端口 80,依此类推。意味着将主网络命名空间中所有接口上的端口 5000 的流量重定向到容器外部接口的端口 5000。
2025-03-25 10:09:38
249
原创 应用-为Pandas选择一个好的文件格式
因此,作为未来灵活性的替代品,我们还将添加一个要求,即您应该能够使用 Polars 轻松处理您的数据,Polars 是一种新兴的Pandas替代品。存储年的列作为一个 16 位整数可以很好地工作,需要两个字节来记录,但在 CSV 中,它总是用 4 个字节加上不同数量的开销 (逗号分隔符) 来写出。CSV 是面向行的,这使得流解析更加容易,但也意味着你不能只加载一个特定的列。如果您正在通过网络传输数据,并且希望在数据到达时逐行处理它,那么这意味着一种非常不同的数据格式: 您需要一些简单的基于行的解析。
2025-03-25 09:20:16
1080
原创 应用-为 Python 选择更快的 JSON 库
如果你查看各种 JSON 库的基准测试页面,它们会讨论它们在不同消息上的表现。这些消息并不一定与你的使用情况相对应。通常情况下,它们测量的是非常大的消息,而在我的案例中,我关心的是小消息。你关心编码、解码,还是两者都关心?你使用的是小消息还是大消息?典型的消息是什么样的?在我的案例中,我主要关心编码小消息,特别是由 Eliot 生成的日志消息的结构。
2025-03-25 09:19:47
906
原创 应用-Python C扩展的隐藏性能开销
另一方面,Rust 具有内存安全、线程安全,并且是一种比 C/C++ 更高级的语言,同时具有相同的性能。因此,NumPy 数组内部存储数字不是作为 Python 列表的 Python 整数,而是作为 C 数组的 C 整数。事实证明,当我们将更多的工作移入像 Rust 的 Ranges 这样的高级构造时,我们最终得到了一个更聪明的解决方案。是用 C 编写的,实际的数学运算非常快,正如我们将在下面看到的。这相当不错,甚至比 NumPy 的实现更快,而且我们不需要创建整个数组的开销。
2025-03-24 10:05:50
850
原创 应用-Cython、Rust 等:如何选择 Python 扩展的语言
这四种语言都可以编译为机器码,并且可能比 Python 快得多。除此之外,它们在许多方面有显著差异。
2025-03-24 10:05:29
1022
原创 应用-使用Numba加速Python计算:2行代码,13倍加速
当你能找到NumPy或SciPy函数来实现你想要的功能时,问题就解决了。但如果不存在呢?这时,如果你想要快速的结果,另一个选择是直接编写低级代码,但这意味着你需要切换到不同的编程语言,构建系统更复杂,整体上也更复杂。在普通Python中运行相同的代码,并在解释器运行时中运行更快的编译版本。轻松快速地迭代算法。Numba解析代码,然后根据输入即时编译。例如,根据输入是u64数组还是浮点数数组,你会得到不同版本的代码。Numba还可以针对CPU以外的运行时;例如,你可以在GPU上运行代码。
2025-03-24 10:05:01
869
原创 应用-所有的 Python 都很慢,但有些比其他的更快
Docker 在 Fedora 上的性能开销似乎出奇地高,但这应该在同一基准测试的运行中是相同的,而且我在之前使用 Podman的基准测试中得到了类似的结果。Python 3.10 有不同的优化设置,我能够使用更新的 Debian(Bullseye 已取代 Buster)和 Ubuntu(22.04)版本以及更新的编译器进行测试。事实证明,根据你安装 Python 的来源不同,其性能可能会有很大差异:选择错误的 Python 版本可能会使你的速度降低 10-20%。越低越好,因为我们测量的是耗时。
2025-03-24 10:04:27
1090
原创 Errno 10061: 在Python3的socket编程中客户端与服务端的连接被拒绝的错误分析
但是,重要的是要处理潜在的错误,如“ConnectionRefusedError: [Errno 10061] 连接被拒绝”,以确保平稳运行。服务器在特定端口上监听传入的连接。在这个示例中,服务器创建一个套接字,将其绑定到特定的地址和端口,并监听传入的连接。客户端创建一个套接字,连接到服务器的地址和端口,发送消息,接收响应并关闭连接。运行客户端代码时,如果服务器未运行或服务器的地址和端口不正确,您可能会遇到“ConnectionRefusedError: [Errno 10061] 连接被拒绝”错误。
2025-03-24 09:30:50
550
原创 应用-在 Pandas 中读取 CSV 的最快方法
而且与 CSV 不同,CSV 中的列类型没有编码在文件中,而在 Parquet 中,列的类型存储在文件中。CSV 是一种糟糕的格式。因此,如果可以,请避免使用 CSV,并使用更好的格式,例如 Parquet。基本上“real”是墙上时钟的经过时间,其他两个指标是 CPU 时间,分为在应用程序代码中运行的时间(“user”)和在 Linux 内核中运行的时间(“sys”)。然而,鉴于 PyArrow 后端本身更快,因为总 CPU 时间减少了一半,即使你已经有了并行性,它也可能提供有意义的速度提升。
2025-03-23 09:09:37
789
原创 应用-避免使用 Cython 的一些原因
如果你不熟悉 Cython,这里有一个简单的例子;技术上 Cython 预定义了malloc和free):我们在编写 Python 代码的同时,可以随时调用 C 代码,并与 C 变量、C 指针等 C 特性进行交互。当你不与 Python 对象交互时,它就是纯粹的 C 代码,具有相应的速度。通常你会将编译添加到setup.py中,但为了测试目的,我们可以直接使用cythonize...$ python>>> pv>>> pv[1](3.0, 5.0)>>> pv。
2025-03-23 09:09:05
843
原创 应用-理解CPU如何帮助加速Numba和NumPy代码
对于C、Rust、Cython等使用的提前编译,编译器通常针对可用功能的子集,以便代码可以在不同的CPU模型之间移植。ARM CPU(如较新的Mac上使用的)与x86-64 CPU有不同的SIMD指令,甚至x86-64 CPU的SIMD指令也因型号而异。是的,仍然有一个条件,但它是在一个相当简单的计算中,不会影响内存写入。因此,这可能会产生影响。在数学上,我们的两个版本是相同的。为了恢复一些丢失的并行性,现代CPU会基于假设大多数代码实际上是可预测的,执行后续代码——并预测条件中的哪个分支将被执行。
2025-03-23 09:07:54
1146
原创 应用-使用Rust加速Python的最简单方法
然而,如果你只是想快速尝试Rust扩展,打包和集成样板代码可能会成为障碍:每增加一点摩擦都会阻碍你进行实验,看看Rust是否真的能带来帮助。的用武之地,它是一个库,使得独立的Rust文件可以轻松地在Python中导入(目前仅支持Linux和macOS)。当你编译Rust代码时,有不同的编译配置文件,它们以不同的方式编译。确实可以扩展到完整的Rust项目,但在这一点上,它的优势下降,切换到更明确的构建系统可能更好。这不是你最终打包库或应用程序时所需的,但我们的用例是原型设计,无论如何你都需要一个编译器。
2025-03-22 11:47:59
917
原创 应用-NumPy 2 即将发布:防止代码破坏,更新你的代码
幸运的话,维护者可能会在 NumPy 2 发布时推出一个新的兼容版本,但这些都是志愿者,他们可能无法按时完成。因此,无论你是直接还是间接使用 NumPy,请确保在你的依赖项列表中添加一个限制性的。重要的是,它是向后不兼容的;这类问题是为什么你需要“固定”应用程序依赖项的众多原因之一:确保你只安装一组特定的、固定的依赖项。如果没有可重现的依赖项,一旦 NumPy 2 发布,你的应用程序在安装新依赖项时可能会崩溃。修复你的代码应该足够简单,但你直接或间接依赖的库不在你的控制范围内,而且通常由志愿者维护。
2025-03-22 11:47:23
932
原创 应用-分析你的 Numba 代码
Profila是一个专门用于识别 Numba 代码中哪些行运行缓慢的性能分析工具。它通过采样工作:它运行一个gdb进程,每隔 10 毫秒左右连接到你的进程,获取回溯信息,并使用这些信息来识别哪些代码行正在运行。获取足够的样本后,你就能了解程序中哪些部分花费了最多的时间。让我们看看 Profila 的实际应用!我们将分析以下程序,该程序对图像进行抖动处理,将其从灰度图像转换为黑白图像。# 使用 numba.njit 装饰的代码看起来像 Python 代码,# 但实际上是在运行时编译为机器码的快速低级代码。
2025-03-22 11:46:16
823
原创 应用-使用SIMD加速Cython
单指令多数据(SIMD)是CPU指令,可以在内存中相邻存储的一系列原始值(整数或浮点数)上执行相同的操作,使用单条指令。编译器需要显式生成这些特殊的指令,这使得利用这一功能变得更加困难。例如,如果我们想将数组中的四个连续整数乘以同一个常数,我们可以使用一条SIMD CPU指令来完成,而不是使用4条普通的CPU指令。将CPU指令数量减少到原来的四分之一可以显著提高速度!
2025-03-21 10:11:04
883
原创 应用-构建并优化 Python 的 Rust 扩展
Rust 既可以扩展到小型项目(如本文中的项目),也可以扩展到更大的项目,这要归功于其内存和线程安全性以及强大的类型系统。Polars 项目有一个 330K 行的通用 Rust 核心,然后用更多的 Rust 和 Python 包装成一个 Python 扩展。我们仍然以相同的方式与 Python 对象交互,遍历 Python 列表,并频繁与 Python 集合交互。如果我们有 10,000,000 个唯一值,我们将创建一个包含 10,000,000 个条目的集合,这将占用大量内存。我们稍后会使用其中一个。
2025-03-21 10:09:55
859
原创 应用-当 NumPy 太慢时
当 NumPy 代码变慢时,首先确保你选择了合适的算法,然后考虑手动优化、使用 JAX 或 Numba 进行即时编译,或者使用 Cython、Rust 等语言进行提前编译。最后,在单核优化达到极限时,再考虑并行化。
2025-03-21 10:09:28
1076
原创 应用-加速 Python 中的文本处理
如果我们用 Rust 编写,它可能会更慢,或者没有更快——但我们可以释放 GIL,从而允许我们利用多核。自行车比开车便宜得多,也更可持续,而且在密集的城市中,它们通常和汽车一样快。更广泛地说,这个函数只是整个处理算法的一部分,我们的时间可能更好地花在其他方式的优化上,或者在更高的抽象层次上进行优化。这样的数据结构,这可能会给我们带来类似的好处,同时允许我们在不编写任何自定义 Rust 代码的情况下完成任务。PyPy 有一个即时编译器,因此它可以注意到经常被调用的代码,并动态生成更优化的机器代码版本。
2025-03-21 10:08:50
952
原创 Pytest第五章(进阶主题2)
这里有一些使用“如何用属性标记测试函数”机制的例子。插件可以提供自定义标记,并基于这些标记实现特定的行为。# conftest.py 的内容"-E",help="仅运行与环境 NAME 匹配的测试。",# 注册一个额外的标记"markers", "env(name): 仅在指定环境中运行测试"pytest.skip(f"测试需要在。
2025-03-21 10:04:44
966
原创 Python3中将字符串转换成bytes
对于编码字符串,我认为 some_string.encode(encoding) 比 bytes(some_string, encoding) 更 Pythonic,因为它是最自文档化的——“用这种编码对这个字符串进行编码”比 bytes(some_string, encoding) 更清晰——当你使用构造函数时没有明确的动词。如果你使用 CPython 将 unicode 字符串传递给 bytes,它会调用 PyUnicode_AsEncodedString,这是 encode 的实现;
2025-03-21 09:56:42
255
原创 测试-当C扩展崩溃时:更轻松地调试你的Python应用程序
问题是,如果你崩溃了,而你只能访问这个输出,你将无法确切知道崩溃发生在哪里:你知道测试模块,但如果你的模块有100个测试,或者这些是集成测试,可能会调用许多不同的代码路径?唯一的注意事项是,如果问题涉及严重的内存损坏,你可能无法获得有用的输出。是一个Linux实用程序,当你的程序段错误时,它会打印一些有用的信息。在生产环境中,你也经常会缺少核心文件,尤其是当你使用Docker时,文件系统通常是临时的。在你的Docker镜像中,你可以通过在。如果崩溃了,你将能够看到导致问题的测试——通常是最后打印的那个。
2025-03-20 14:47:52
1013
原创 测试-真实、简单且足够快:使用Docker进行数据库测试
第三,你可以在隔离的进程文件系统中的任何位置挂载自定义目录。许多数据库测试实际上不会插入那么多行,而且你不需要每次都从头创建数据库,现代SSD的速度也快了很多。因此,当程序写入文件时,默认情况下数据不会立即写入磁盘:而是存储在内存中,操作系统会在某个时候将这些内存写入磁盘。:如果你在生产环境中使用像PostgreSQL这样的关系型数据库,可以用内存中的SQLite来替代。这更快,但你现在使用的是不同的数据库,它。不幸的是,这并非在所有应用程序中都可行,并且可能会限制你可以进行的测试类型。
2025-03-20 14:47:06
725
原创 测试-使用测试套件捕获内存泄漏
进程可以拥有的文件描述符数量是有限的,因此如果你不断泄漏打开的文件,最终你的进程将无法打开更多的文件或套接字。与内存泄漏类似,你可以通过测试套件捕获这些泄漏,使用类似的 fixture。在 Python 中,一旦对象不再有任何引用(或更准确地说,没有来自模块或运行代码的引用),内存会自动释放。如果这些条件成立,并且在许多情况下它们确实成立,你可以使用测试套件帮助识别内存(或其他资源泄漏)的来源。一个好的测试套件不仅可以帮助确保代码具有正确的语义并满足必要的合同,还可以在某些情况下帮助检查运行时特性。
2025-03-20 14:46:22
1001
原创 在Vim中,remap、noremap、nnoremap和vnoremap映射命令之间的区别
是一个选项,使映射递归工作。默认情况下,它是打开的,我建议你保持这个状态。对于这些映射集中的每一个,都有一个映射在正常、视觉、选择和操作模式下工作 (现在请记住 Vim 是一个模态编辑器。它有正常模式、视觉模式和其他模式。是各种映射命令的递归和非递归版本。),一个仅在正常模式下工作 (),一个在视觉模式下工作 (
2025-03-20 14:35:42
181
python3+django3+html+boostrap3
2020-12-01
python3.7+django3+html搭建网站初次尝试
2020-11-19
pythondoc.rar
2019-11-07
python tkinter实现的简单计算器.py
2018-01-22
python通过ctypes调用c\c++编写的dll\so库
2018-01-18
Python连接并操作mysql数据库的基本方法.py
2018-01-18
python编写的opencv示例代码可直接运行OpenCVForPython.py
2018-01-11
Python与cmd终端交互,使用argparse示例.py
2017-11-15
Python多进程示例multiprocess.py
2017-11-15
Python装饰器decoder.py
2017-11-15
UiAutomatorRFTestLibrary.py
2017-11-15
python使用appium进行Android自动化测试(appium.py)
2017-10-23
python多线程编程示例(threading.py)
2017-10-23
Robot Framework自动化测试修炼宝典.pdf
2017-10-23
JAVA入门经典.pdf
2017-09-18
Python使用OPencv进行图片像素比对
2017-09-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人