标签归档:Python

Hosts-🔒整合和扩展来自多个精心管理的来源的HOSTS

具有基本扩展名的统一HOSTS文件

这个存储库整合了几个信誉良好的hosts文件,并将它们合并到删除重复项的统一主机文件中。提供了各种定制的主机文件

所有主机文件变体的列表

此存储库提供15 different host file variants,除了基本变体之外

这个非GitHub镜像是用于某些主机文件管理器的链接,如Hostsman for Windows不适用于GitHub下载链接

主机文件配方 自述文件 原始主机 唯一域 非GitHub镜像
统一主机=(广告软件+恶意软件) Readme link 81747 link
统一主机+假新闻 Readme link 83,942 link
统一主机+赌博 Readme link 84,204 link
统一主机+色情 Readme link 107,898 link
统一主机+社交 Readme link 84,562 link
统一主机+假新闻+赌博 Readme link 86,399 link
统一主机+假新闻+色情 Readme link 110,093 link
统一主机+假新闻+社交 Readme link 86,757 link
统一主机+赌博+色情 Readme link 110,355 link
统一主机+赌博+社交 Readme link 87,019 link
统一主机+色情+社交 Readme link 110,712 link
统一主机+假新闻+赌博+色情 Readme link 112,550 link
统一主机+假新闻+赌博+社交 Readme link 89,214 link
统一主机+假新闻+色情+社交 Readme link 112,907 link
统一主机+赌博+色情+社交 Readme link 113,169 link
统一主机+假新闻+赌博+色情+社交 Readme link 115,364 link

期望值:这些统一主机文件应服务于所有设备,而与操作系统无关

此变体中统一的主机数据源

已更新hosts来自以下位置的文件始终是统一的并包含在其中:

主机文件源 描述 主页 原始主机 更新频率 许可证 问题
史蒂文·布莱克的特别名单 当我遇到其他草图域时 link raw 偶尔 麻省理工学院 issues
阿达维 Adaway是一个开源的Android广告拦截器,使用的是Hosts文件 link raw 经常 将CC提高到3.0 issues
add.2o7Net 207Net跟踪站点基于hostsfile.org内容 link raw 偶尔 麻省理工学院 issues
add.Dead 基于以下条件的死点hostsfile.org内容 link raw 偶尔 麻省理工学院 issues
add.Risk 基于以下条件的风险内容网站hostsfile.org内容 link raw 偶尔 麻省理工学院 issues
add.Spam 基于以下内容的垃圾网站hostsfile.org内容 link raw 偶尔 麻省理工学院 issues
AdGuardTeam cname跟踪器 CNAME-伪装的跟踪滥用 link raw 偶尔 麻省理工学院 issues
Mitchell Krog‘s-Badd Boyz主持 来自My Nginx和Apache Bad Bot的粗略域名和不良推荐人和垃圾邮件推荐人拦截器 link raw 每周一次 麻省理工学院 issues
主机VN 主持挡路越南语广告 link raw 偶尔 麻省理工学院 issues
KADhosts 欺诈/广告软件/诈骗网站 link raw 经常 CC BY-SA 4.0 issues
MetaMask ETH-网络钓鱼-检测 针对以太用户的钓鱼域名 link raw 频繁 不要做一个混蛋的公共执照 issues
我的世界-主持人 与“我的世界”相关的跟踪器主机 link raw 偶尔 CC0-1.0 issues
MVP主机文件 此站点的目的是为用户提供高质量的自定义主机文件 link raw 每月一次 CC BY-NC-SA 4.0 issues
orca.pet 这是用于阻止网络钓鱼和恶意软件站点的域列表 link raw 频繁 ISC issues
osint.digitalside.it DigitalSide威胁-英特尔恶意软件域列表 link raw 每天 麻省理工学院 issues
阴暗的-主机 分析、广告和活动监控主机 link raw 偶尔 CC0-1.0 issues
丹·波洛克-someonewhocares 如何让互联网不那么糟糕 link raw 经常 具有归属的非商业性 issues
Tiuxo主机列表-广告 用于基于DNS的内容阻止的分类主机文件 link raw 偶尔 CC增加4.0 issues
取消检查广告 Windows Installers ADS源站点基于https://unchecky.com/内容 link raw 偶尔 麻省理工学院 issues
URLHaus 来自以下项目的项目abuse.ch以共享恶意URL为目标 link raw 每周一次 CC0 issues
yoyo.org 使用广告服务器和跟踪服务器主机名阻止 link raw 经常 issues

扩展部分

统一主机文件是可选的可扩展文件。扩展用于按类别包括域。目前,我们提供以下类别:fakenewssocialgambling,以及porn

扩展名是可选的,可以通过各种方式与基本主机文件组合。组合后的产品存储在alternates文件夹

扩展模块的数据存储在extensions文件夹。您可以通过管理此文件夹树来管理扩展模块,您可以在其中找到以下文件夹树的数据fakenewssocialgambling,以及porn我们为您维护和提供的扩展数据

生成您自己的统一主机文件

您有两个选项可以生成自己的主机文件。您可以在自己的环境中完成,也可以在Docker容器中完成。我们将首先报道码头,因为这是一个很短的部分

选项1:在Docker容器中生成

我们提供一个Dockerfile您可以使用它来创建一个包含您需要的一切的Docker容器。容器将包含Python 3及其所有依赖项要求,以及此资料档案库的最新版本副本

如下所示构建Docker容器:

docker build ./

通过如下方式访问终端:

docker run -it (containerid) bash

选项2:在您自己的环境中生成它

要生成您自己的合并主机文件,您需要Python 3.5或更高版本

首先,使用以下命令安装依赖项:

pip3 install --user -r requirements.txt

注意事项我们建议您将--user在用户级别安装所需依赖项的标志。有关它的更多信息可以在pip上找到。documentation

与您的开发环境无关的通用步骤

运行单元测试在顶级目录中,运行:

python3 testUpdateHostsFile.py

这个updateHostsFile.py脚本将根据本地中的源文件生成统一的主机文件data/子文件夹。该脚本将提示您是否应获取更新的版本(从update.json每个源文件夹中的文本文件)。否则,它将使用hosts已经在那里的文件

python3 updateHostsFile.py [--auto] [--replace] [--ip nnn.nnn.nnn.nnn] [--extensions ext1 ext2 ext3]

命令行选项:

--help,或-h:显示帮助

--auto,或-a:在没有提示的情况下运行脚本。什么时候--auto被调用,

  • 主机数据源(包括扩展模块)将更新
  • 默认情况下不包括分机。使用--extensions-e标志以包括您想要的任何内容
  • 您的活动主机文件是替换,除非您将--replace旗帜

--backup,或-b:在覆盖现有主机文件时对其进行备份

--extensions <ext1> <ext2> <ext3>,或-e <ext1> <ext2> <ext3>:下面的子文件夹的名称extensions包含要包括在合并中的其他类别特定主机文件的文件夹。示例:--extensions porn-e social porn

--flush-dns-cache,或-f:跳过刷新DNS缓存的提示。仅在以下情况下才处于活动状态--replace也处于活动状态

--ip nnn.nnn.nnn.nnn,或-i nnn.nnn.nnn.nnn:用作目标的IP地址。默认值为0.0.0.0

--keepdomaincomments,或-ktrue(默认)或false,保留与域显示在同一行上的注释。默认值为true

--noupdate,或-n:跳过从主机数据源获取更新

--output <subfolder>,或-o <subfolder>:将生成的源文件放入子文件夹。如果子文件夹不存在,则会创建子文件夹

--replace,或-r:触发器替换您的活动主机

--skipstatichosts,或-sfalse(默认)或true,省略顶部的标准部分,包含如下行127.0.0.1 localhost这对于在本地网络上配置最接近的DNS服务很有用

--nogendata,或-gfalse(默认)或true跳过用于生成readme.md文件的readmeData.json文件的生成。如果您正在生成具有附加白名单或黑名单的主机文件,并且希望保持此存储库的本地签出不被修改,则此功能非常有用

--compress,或-cfalse(默认)或true压缩主机文件忽略不必要的行(空行和注释),并在每行中放置多个域。减少主机文件的行数可提高Windows(启用DNS客户端服务)下的性能

--minimise,或-mfalse(默认)或true,就像--compress,但将每个域放在单独的行上。这是必要的,因为许多URL拦截器实现依赖于hosts文件不符合允许在单行上有多个主机的标准

--blacklist <blacklistfile>,或-x <blacklistfile>:将给定的HOSTS格式的黑名单文件追加到生成的HOSTS文件中

--whitelist <whitelistfile>,或-w <whitelistfile>:使用给定的白名单文件从生成的主机文件中删除主机

使用NixOS:

要在您的计算机上安装主机文件,请将以下内容添加到您的configuration.nix

{
  networking.extraHosts = let
    hostsPath = https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts;
    hostsFile = builtins.fetchurl hostsPath;
  in builtins.readFile "${hostsFile}";
}
  • 注:更改hostsPath如果您需要其他版本的主机文件
  • 注意:调用fetchurl是不纯洁的。使用fetchFromGitHub如果您希望始终获得相同的结果,请使用精确提交

我如何控制哪些源是统一的?

添加一个或多个附加内容源文件,每个源文件都位于data/文件夹,并指定url键入ITSupdate.json文件

添加一个或多个可选扩展名,这些扩展名源自extensions/文件夹。同样,中的urlupdate.json控制此扩展模块查找其更新的位置

创建一个可选blacklist文件。此文件的内容(包含中的其他域列表hosts文件格式)在更新过程中被附加到统一主机文件。一份样品blacklist包括在内,并且可以根据需要进行修改

  • 注:blacklist不会被git跟踪,因此当您执行以下操作时,您所做的任何更改都不会被覆盖git pull此回购来自origin在未来

如何包含我自己的自定义域映射?

如果您有自定义主机记录,请将它们放入文件中myhosts在更新过程中,此文件的内容将作为统一主机文件的前缀

这个myhosts文件不会被git跟踪,因此当您执行以下操作时,您所做的任何更改都不会被覆盖git pull此回购来自origin在未来

如何防止包含域?

中列出的域whitelist文件从最终的主机文件中排除

这个whitelist使用部分匹配。所以如果你把白名单google-analytics.com,则该域及其所有子域不会合并到最终的主机文件中

这个whitelist不会被git跟踪,因此当您执行以下操作时,您所做的任何更改都不会被覆盖git pull此回购来自origin在未来

我如何贡献主机记录?

如果您发现您认为应该包含在这里的粗略域名,这里有一些贡献它们的方法

选项1:联系我们的一位主机来源

包含新域名的最佳方式是向主页为以下内容的任何数据提供商提交问题listed here这是最好的,因为一旦您提交新的域名,它们将由维护这些源的专职人员进行管理和更新

选项2:分叉此存储库,将您的域添加到Steven Black的个人数据文件中,然后提交拉取请求

分叉此主机此回购并将您的链接添加到https://github.com/StevenBlack/hosts/blob/master/data/StevenBlack/hosts

然后,提交拉取请求

警告:这比方案1更不可取,因为正在进行的管理落在我们身上。所以这给我们带来了更多的工作

选项3:在GitHub上创建您自己的主机列表作为回购

如果您能够策划您自己的粗略域名集合,那么就策划您自己的主机列表。然后发出回购存在的信号,如下所示a new issue当我们创建新版本时,我们可能会将您的新回购包括到我们拉取的资源集合中

什么是主机文件?

一个HOSTS文件,名为hosts(不带文件扩展名)是所有操作系统用于将主机名映射到IP地址的纯文本文件

在大多数操作系统中,hosts文件优先于DNS因此,如果域名由hosts文件,则请求永远不会离开您的计算机

拥有一个聪明的hosts文件在阻止恶意软件、广告软件和其他刺激物方面大有裨益

例如,要使对某些Doubleclick.net服务器的请求无效,可以将以下行添加到主机文件中:

# block doubleClick's servers
0.0.0.0 ad.ae.doubleclick.net
0.0.0.0 ad.ar.doubleclick.net
0.0.0.0 ad.at.doubleclick.net
0.0.0.0 ad.au.doubleclick.net
0.0.0.0 ad.be.doubleclick.net
# etc...

我们建议您使用0.0.0.0而不是127.0.0.1

传统上,大多数主机文件使用127.0.0.1,即环回地址,建立到本地计算机的IP连接

我们更喜欢用0.0.0.0,它被定义为用于指定无效、未知或不适用的目标的不可路由的元地址

使用0.0.0.0在经验上更快,可能是因为不需要等待超时解决方案。它也不会干扰可能在本地PC上运行的Web服务器

为什么不使用0而不是0.0.0.0

我们试过了。使用0并不是普遍有效

主机文件的位置

要修改您的当前hosts文件中,在以下位置查找该文件,然后使用文本编辑器对其进行修改

MacOS(10.14.x之前的MacOS Mojave)、iOS、Android、Linux/etc/hosts文件

MacOS Catalina:/private/etc/hosts文件

窗口%SystemRoot%\system32\drivers\etc\hosts文件

根图(Gentoo)

Gentoo用户可以找到sb-hosts在……里面::pf4publicGentoo覆盖

在Windows上更新主机文件

(注意:另请参阅下面列出的一些第三方主机管理器。)

在Linux和MacOS上,运行Python脚本。在Windows上,由于兼容性问题需要做更多工作,因此最好按如下方式运行批处理文件:

updateHostsWindows.bat

此文件必须以存储库目录中的管理员权限在命令提示符下运行。除了更新HOSTS文件之外,它还可以替换现有的HOSTS文件,并重新加载DNS缓存。不用说,要想让它起作用,你必须连接到互联网上。

要以管理员身份在资料库目录中打开命令提示符,请执行以下操作:

Windows XP:Start→Run→cmd

Windows Vista,7:开始按钮→类型cmd→右键单击命令提示符→“以管理员身份运行”

Windows 8:Start→Swipe Up→All Apps→Windows System→右键单击命令提示符→“以管理员身份运行”

Windows 10:开始按钮→类型cmd→右键单击命令提示符→“以管理员身份运行”

您还可以参考“第三方主机管理器”部分,了解来自第三方的更多推荐解决方案

警告:使用此hostsWindows中的文件可能需要禁用DNS缓存服务

Windows对较大的主机文件有问题。Windows10安全方面的最新变化拒绝通过除注册表黑客之外的其他工具访问更改的服务。使用disable-dnscache-service-win.cmd文件对Windows注册表进行适当更改。完成此操作后,您将需要重新启动设备。请参阅the comments within the cmd file有关更多详细信息,请参阅

正在重新加载主机文件

您的操作系统将缓存DNS查找。一旦新的主机文件就位,您可以重新引导或运行以下命令来手动刷新DNS缓存

|Google Chrome浏览器可能需要手动清除其DNS缓存chrome://net-internals/#dns页,然后查看主机文件中的更改。请参见:https://superuser.com/questions/723703

窗口

使用管理员权限打开命令提示符,然后运行以下命令:

ipconfig /flushdns

Linux操作系统

打开终端并以root权限运行:

Debian/Ubuntusudo service network-manager restart

Linux铸币厂sudo /etc/init.d/dns-clean start

带systemd的Linuxsudo systemctl restart network.service

Feddora Linuxsudo systemctl restart NetworkManager.service

带网络管理器的Arch Linux/Manjarosudo systemctl restart NetworkManager.service

带Wicd的Arch Linux/Manjarosudo systemctl restart wicd.service

RHEL/CentOSsudo /etc/init.d/network restart

FreeBSDsudo service nscd restart

要启用nscd守护程序最初,建议您运行以下命令:

sudo sysrc nscd_enable="YES"
sudo service nscd start

然后修改hosts在您的/etc/nsswitch.conf文件保存到以下位置:

hosts: cache files dns

其他:咨询this Wikipedia article

MacOS

打开终端并运行:

sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder

版本管理

此存储库使用release-it,一个用于GitHub repos和NPM包的优秀CLI发布工具,可自动创建releases这就是为什么package.json.release-it.json文件捆绑在一起

此统一主机文件的目标

这项回购的目标是:

  1. 自动组合高质量的主机列表,
  2. 提供适合情况的扩展,
  3. 对得到的组合列表进行去重,
  4. 并使生成的文件保持合理的大小

高质量的信息源在这里被定义为经过积极策划的信息源。主机源应该由其维护人员频繁更新,包括添加和删除。主机文件越大,预期的管理级别就越高

预计此统一的HOSTS文件将在各种操作系统下同时服务于台式机和移动设备

第三方托管经理

  • Unified Hosts AutoUpdate(适用于Windows):Unified Hosts AutoUpdate软件包是专门为此Unified Hosts项目构建的,并且由社区成员积极开发。您可以安装和卸载任何黑名单并自动使其保持最新,并且可以放置在共享网络位置,并通过组策略在整个组织中部署。由于社区成员正在积极开发它,因此非常欢迎您的bug报告、特性请求和其他反馈
  • ViHoMa是一个Visual Hosts文件管理器,由Christian Martínez用Java编写。看看这个!

有趣的应用程序

  • Maza ad blocking是自动更新主机文件的bash脚本。您还可以更新新的副本。并且每次它都会生成与DNSMASQ兼容的配置文件。快速安装,兼容MacOS、Linux和BSD
  • Hostile是一个漂亮的命令行实用程序,可以轻松地在主机文件中添加或删除域。如果我们的主机文件对您来说太过激进,您可以使用hostile来删除域,或者您可以使用hostile在bash脚本中,以便在每次下载主机的新版本时自动执行开机自检过程
  • macOS Scripting for Configuration, Backup and Restore帮助自定义、重新安装和使用MacOS。它还提供了一个script在MacOS上使用此项目安装和更新HOSTS文件。与一个launchd它每x天更新一次主机文件(默认值为4)。要同时安装两者,请下载GitHub存储库并运行install script从上一级目录开始
  • Pi-hole是在网络范围内运行的DHCP服务器和广告拦截器Raspberry PiPI-HOLE使用此存储库作为其来源之一
  • Block ads and malware via local BIND9 DNS server(对于Debian、Raspbian和Ubuntu):使用/etc/bind/named.conf.blocked文件,来源为此处
  • Block ads, malware, and deploy parental controls via local DualServer DNS/DHCP server(对于BSD、Windows和Linux):使用针对DualServer重新格式化的统一主机的功能,为您网络中的每个人设置黑名单。如果您使用的是Windows,该项目还会维护一个更新脚本,使更新DualServer的黑名单变得更加容易
  • Blocking ads and malwares with unboundUnbound是验证、递归和缓存DNS解析器
  • dnsmasq conversion script这个GitHub要点有一个简短的shell脚本(bash,可以在任何“nix”上运行),并使用wget&awk存在于大多数发行版中,用于获取指定的主机文件并将其转换为dnsmasq所需的格式。支持IPv4和IPv6。设计为既可以用作shell脚本,也可以放入/etc/cron.Week(或任何合适的位置)。该脚本简短且易于编辑,还附带一个简短的文档,并附带有关dnsmasq设置的说明
  • BlackHosts – Command Line Installer/Updater这是一个跨平台的命令行实用程序,用于帮助安装/更新在此存储库中找到的主机文件

贡献自己的力量!

请阅读我们的Contributing Guide此外,这还解释了我们如何组织此存储库中的文件和文件夹

我们总是对发现精心安排的宿主来源感兴趣。如果您找到一个,请打开一个issue为了引起我们的注意

在您创建或回应任何问题之前,请阅读我们的code of conduct

Glances 顶级的HTOP替代方案

摘要

Glances 是一个跨平台的监控工具,旨在通过诅咒或基于Web的界面呈现大量的监控信息。信息根据用户界面的大小动态调整

它还可以在客户端/服务器模式下工作。远程监控可以通过终端、Web界面或API(XML-RPC和RESTful)来完成。还可以将统计数据导出到文件或外部时间/值数据库

Glance是用Python编写的,它使用库从您的系统中获取信息。它基于开放式体系结构,开发人员可以在其中添加新插件或导出模块

要求

  • python>=2.7python>=3.4
  • psutil>=5.3.0(最新版本更好)
  • defusedxml(为了实现猴子路径xmlrpc)
  • future(用于Python 2支持)

Python 2.6用户注意事项

扫视不再支持Python 2.6。请至少升级到2.7/3.4+的Python版本或降级到2.6.2(支持Python 2.6的最新版本)

针对Python 2.x用户的弃用警告说明

Glance版本4.0将不再支持Python 2.x

可选依赖项:

  • bernhard(用于Riemann导出模块)
  • bottle(用于Web服务器模式)
  • cassandra-driver(用于Cassandra导出模块)
  • chevron(对于操作脚本功能)
  • couchdb(对于CouchDB导出模块)
  • docker(用于Docker监控支持)[仅Linux/MacOS]
  • elasticsearch(对于弹性搜索导出模块)
  • graphitesender(适用于Graphite导出模块)
  • hddtemp(支持硬盘温度监控)[仅限Linux]
  • influxdb(适用于InfluxDB版本1导出模块)
  • influxdb-client(适用于InfluxDB版本2导出模块)[仅适用于Python>=3.6]
  • kafka-python(用于卡夫卡导出模块)
  • netifaces(适用于IP插件)
  • py3nvml(适用于GPU插件)[仅适用于Python 3]
  • pika(适用于RabbitMQ/ActiveMQ导出模块)
  • potsdb(适用于OpenTSDB导出模块)
  • prometheus_client(适用于普罗米修斯出口模块)
  • py-cpuinfo(适用于QuickLook CPU信息模块)
  • pygal(用于图形导出模块)
  • pymdstat(用于RAID支持)[仅限Linux]
  • pysnmp(用于SNMP支持)
  • pySMART.smartx(用于硬盘智能支持)[仅限Linux]
  • pyzmq(适用于ZeroMQ导出模块)
  • requests(针对端口、云插件和REST风格的导出模块)
  • scandir(适用于文件夹插件)[仅适用于Python<3.5]
  • sparklines(适用于快速插件迷你图选项)
  • statsd(用于StatsD导出模块)
  • wifi(适用于wifi插件)[仅限Linux]
  • zeroconf(对于自动发现模式)

安装

有几种方法可以在您的系统上测试/安装扫视。选择你的武器!

PyPI:简单的方法

“扫视”处于打开状态PyPI通过使用PyPI,您将使用最新的稳定版本

要安装扫视,只需使用pip

pip install --user glances

注意事项:需要Python标头才能安装psutil,看一眼就知道了。例如,在Debian/Ubuntu上,您需要首先安装Python-dev包裹(Python-devel在Fedora/CentOS/RHEL上)。对于Windows,只需从二进制安装文件安装psutil

注2(适用于Wifi插件):如果您想使用Wifi插件,您需要安装无线-工具系统上的软件包

您还可以安装下列库以使用可选功能(如Web界面、导出模块):

pip install --user 'glances[action,browser,cloud,cpuinfo,docker,export,folders,gpu,graph,ip,raid,snmp,web,wifi]'

要将扫视升级到最新版本,请执行以下操作:

pip install --user --upgrade glances
pip install --user --upgrade glances[...]

如果需要在特定用户位置安装扫视,请使用:

export PYTHONUSERBASE=~/mylocalpath
pip install --user glances

如果您是管理员,并且要为所有用户安装扫视,请执行以下操作:

sudo pip install glances

当前的开发分支也发布到test.pypi.org包索引。如果要测试开发版本,请输入:

pip install --user -i https://test.pypi.org/simple/ Glances

自动安装脚本一瞥:总而言之

要同时安装依赖项和最新的扫视生产就绪版本(又名师傅分支),只需输入以下命令行:

curl -L https://bit.ly/glances | /bin/bash

wget -O- https://bit.ly/glances | /bin/bash

注意事项:这只在一些GNU/Linux发行版和MacOSX上受支持。如果您想支持其他发行版,请贡献给glancesautoinstall

多克:有趣的方式

一瞥容器是可用的。您可以使用它来监控您的服务器和所有其他容器!

获取扫视容器:

docker pull nicolargo/glances:<version>

示例:

  • Nicolargo/扫视:3.2.0(或尼古拉/扫视:阿尔卑斯-3.2.0)用于具有最小依赖关系的版本3.2.0
  • Nicolargo/扫视:3.2.0-Full对于具有完全依赖关系的版本3.2.0

有关完整的图像列表,请执行以下操作:

将容器放入控制台模式

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it nicolargo/glances:3.2.0-full

此外,如果要使用自己的glances.conf文件,可以创建自己的Dockerfile:

FROM nicolargo/glances:latest
COPY glances.conf /glances/conf/glances.conf
CMD python -m glances -C /glances/conf/glances.conf $GLANCES_OPT

或者,可以使用停靠码头管路选项沿相同的路线指定某些内容:

docker run -v `pwd`/glances.conf:/glances/conf/glances.conf -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host -it nicolargo/glances:3.2.0-full

其中,`pwd`/glances.conf是包含glances.conf文件的本地目录

将容器放入Web服务器模式(请注意GOLENICS_OPT环境变量设置GLEANCES STARTUP命令的参数):

docker run -d --restart="always" -p 61208-61209:61208-61209 -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host nicolargo/glances:3.2.0-full

GNU/Linux

Glance在许多Linux发行版上都可用,因此您应该能够使用您最喜欢的包管理器来安装它。请注意,当您使用此方法时,操作系统package因为浏览可能不是最新版本

FreeBSD

要安装二进制软件包,请执行以下操作:

# pkg install py37-glances

要从端口安装扫视,请执行以下操作:

# cd /usr/ports/sysutils/py-glances/
# make install clean

MacOS

如果不想使用glancesautoinstall脚本,请按照以下过程操作

MacOS用户可以使用HomebrewMacPorts

自制酒

$ brew install glances

MacPorts

$ sudo port install glances

窗口

安装Python对于Windows(Python 2.7.9+和3.4+随pip一起提供),然后运行以下命令:

$ pip install glances

安卓系统

您需要一个带根的设备,并且Termux应用程序(在Google Play商店提供)

在您的设备上启动Termux并输入:

$ apt update
$ apt upgrade
$ apt install clang python
$ pip install bottle
$ pip install glances

开始扫视:

$ glances

您还可以在服务器模式(-s或-w)下运行扫视,以便远程监控您的Android设备

来源

要从源安装扫视,请执行以下操作:

$ wget https://github.com/nicolargo/glances/archive/vX.Y.tar.gz -O - | tar xz
$ cd glances-*
# python setup.py install

注意事项:安装psutil需要Python标头

厨师

一辆令人敬畏的车Chef您可以使用食谱来监控您的基础架构:https://supermarket.chef.io/cookbooks/glances(感谢安东尼·鲁耶)

木偶

您可以使用以下命令安装扫视Puppethttps://github.com/rverchere/puppet-glances

可笑的

一瞥Ansible角色可用:https://galaxy.ansible.com/zaxos/glances-ansible-role/

用法

对于独立模式,只需运行:

$ glances

对于Web服务器模式,运行:

$ glances -w

并输入URLhttp://<ip>:61208在您最喜欢的Web浏览器中

对于客户端/服务器模式,请运行:

$ glances -s

在服务器端,并运行:

$ glances -c <ip>

在客户端1上

您还可以检测并显示您的网络上可用的或在配置文件中定义的所有扫视服务器:

$ glances --browser

您还可以在stdout上显示原始统计信息:

$ glances --stdout cpu.user,mem.used,load
cpu.user: 30.7
mem.used: 3278204928
load: {'cpucore': 4, 'min1': 0.21, 'min5': 0.4, 'min15': 0.27}
cpu.user: 3.4
mem.used: 3275251712
load: {'cpucore': 4, 'min1': 0.19, 'min5': 0.39, 'min15': 0.27}
...

或CSV格式,这要归功于stdout-csv选项:

$ glances --stdout-csv now,cpu.user,mem.used,load
now,cpu.user,mem.used,load.cpucore,load.min1,load.min5,load.min15
2018-12-08 22:04:20 CEST,7.3,5948149760,4,1.04,0.99,1.04
2018-12-08 22:04:23 CEST,5.4,5949136896,4,1.04,0.99,1.04
...

和RTFM,总是

文档

有关完整的文档,请查看readthedocs网站

如果您有任何问题(在RTFM之后),请发布在官方问答上forum

其他服务的网关

扫视可以将统计数据导出到:CSV文件,JSON文件,InfluxDBCassandraCouchDBOpenTSDBPrometheusStatsDElasticSearchRabbitMQ/ActiveMQZeroMQKafkaRiemannGraphiteRESTful服务器

如何贡献?

如果你想为“扫视”项目做贡献,请阅读这篇文章。wiki页面

还有一个专门针对扫视开发人员的聊天室:



捐赠

如果这个项目对你有帮助,你可以给我小费;)

请参阅sponsors页面

作者

尼古拉斯·亨尼昂(@nicolargo)<nicolas@nicolargo.com>


许可证

Glance是在LGPL版本3许可下分发的。看见COPYING有关更多详细信息,请参阅

Tqdm-一个用于Python和CLI的快速、可扩展的进度条

TQDM

tqdm派生自阿拉伯语单词塔卡杜姆(تقدّم)可以是“进步”的意思,在西班牙语中是“我非常爱你”的缩写(德马西亚多)

立即使您的循环显示一个智能进度表-只需用tqdm(iterable),你就完了!

from tqdm import tqdm
for i in tqdm(range(10000)):
    ...

76%|████████████████████████        | 7568/10000 [00:33<00:10, 229.00it/s]

trange(N)还可以用作以下操作的便捷快捷方式tqdm(range(N))

它还可以作为带有管道的模块执行:

$ seq 9999999 | tqdm --bytes | wc -l
75.2MB [00:00, 217MB/s]
9999999

$ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \
    > backup.tgz
 32%|██████████▍                      | 8.89G/27.9G [00:42<01:31, 223MB/s]

开销很低–每次迭代约60 ns(80 ns,tqdm.gui),并针对性能回归进行单元测试。相比之下,久负盛名的ProgressBar具有800 ns/ITER开销

除了开销低之外,tqdm使用智能算法预测剩余时间并跳过不必要的迭代显示,这在大多数情况下可以忽略不计的开销

tqdm可在任何平台(Linux、Windows、Mac、FreeBSD、NetBSD、Solaris/SunOS)、任何控制台或GUI中运行,并且与IPython/Jupyter笔记本电脑也很友好

tqdm不需要任何依赖项(甚至不需要curses!),只有Python和一个支持carriage return \rline feed \n控制字符


Installation

Latest PyPI stable release


pip install tqdm

Latest development release on GitHub

拉入并安装预发行版devel分支机构:

pip install "git+https://github.com/tqdm/tqdm.git@devel#egg=tqdm"

Latest Conda release

conda install -c conda-forge tqdm

Latest Snapcraft release

有3个频道可供选择:

snap install tqdm  # implies --stable, i.e. latest tagged release
snap install tqdm  --candidate  # master branch
snap install tqdm  --edge  # devel branch

请注意,snap二进制文件仅供CLI使用(而不是import-可用),并自动设置bash制表符完成

Latest Docker release

docker pull tqdm/tqdm
docker run -i --rm tqdm/tqdm --help

Other

还有其他(非官方的)地方tqdm可以下载,特别是对于CLI使用:


Changelog

所有更改的列表可在GitHub的版本上获得:,在wiki,或在website

Usage

tqdm是非常多才多艺的,可以有多种用途。下面给出了三个主要的原因

Iterable-based

包装tqdm()围绕任何可迭代:

from tqdm import tqdm
from time import sleep

text = ""
for char in tqdm(["a", "b", "c", "d"]):
    sleep(0.25)
    text = text + char

trange(i)是一个特殊的优化实例tqdm(range(i))

from tqdm import trange

for i in trange(100):
    sleep(0.01)

循环外的实例化允许手动控制tqdm()

pbar = tqdm(["a", "b", "c", "d"])
for char in pbar:
    sleep(0.25)
    pbar.set_description("Processing %s" % char)

Manual

手动控制tqdm()使用with声明:

with tqdm(total=100) as pbar:
    for i in range(10):
        sleep(0.1)
        pbar.update(10)

如果可选变量total(或使用可迭代的len()),则显示预测统计信息

with也是可选的(您可以直接将tqdm()赋给一个变量,但在这种情况下,不要忘记delclose()在结尾处:

pbar = tqdm(total=100)
for i in range(10):
    sleep(0.1)
    pbar.update(10)
pbar.close()

Module

也许最奇妙的用法就是tqdm是在脚本中还是在命令行上。简单地插入tqdm(或python -m tqdm)之间的管道将通过所有stdinstdout将进度打印到时stderr

下面的示例演示了如何计算当前目录中所有Python文件中的行数,其中包括计时信息

$ time find . -name '*.py' -type f -exec cat \{} \; | wc -l
857365

real    0m3.458s
user    0m0.274s
sys     0m3.325s

$ time find . -name '*.py' -type f -exec cat \{} \; | tqdm | wc -l
857366it [00:03, 246471.31it/s]
857365

real    0m3.585s
user    0m0.862s
sys     0m3.358s

请注意,通常的论点是tqdm也可以指定

$ find . -name '*.py' -type f -exec cat \{} \; |
    tqdm --unit loc --unit_scale --total 857366 >> /dev/null
100%|█████████████████████████████████| 857K/857K [00:04<00:00, 246Kloc/s]

备份一个大目录吗?

$ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \
  > backup.tgz
 44%|██████████████▊                   | 153M/352M [00:14<00:18, 11.0MB/s]

这还可以进一步美化:

$ BYTES="$(du -sb docs/ | cut -f1)"
$ tar -cf - docs/ \
  | tqdm --bytes --total "$BYTES" --desc Processing | gzip \
  | tqdm --bytes --total "$BYTES" --desc Compressed --position 1 \
  > ~/backup.tgz
Processing: 100%|██████████████████████| 352M/352M [00:14<00:00, 30.2MB/s]
Compressed:  42%|█████████▎            | 148M/352M [00:14<00:19, 10.9MB/s]

或使用7-zip在文件级完成:

$ 7z a -bd -r backup.7z docs/ | grep Compressing \
  | tqdm --total $(find docs/ -type f | wc -l) --unit files \
  | grep -v Compressing
100%|██████████████████████████▉| 15327/15327 [01:00<00:00, 712.96files/s]

已经输出基本进度信息的现有CLI程序将受益于tqdm%s--update--update_to标志:

$ seq 3 0.1 5 | tqdm --total 5 --update_to --null
100%|████████████████████████████████████| 5.0/5 [00:00<00:00, 9673.21it/s]
$ seq 10 | tqdm --update --null  # 1 + 2 + ... + 10 = 55 iterations
55it [00:00, 90006.52it/s]

FAQ and Known Issues

最常见的问题与多行输出过多有关,而不是整齐的单行进度条

  • 一般控制台:需要回车支持(CR\r)
  • 嵌套进度条:
    • 一般控制台:需要支持将光标上移到上一行。例如,IDLEConEmuPyCharm(亦请参阅herehere,以及here)缺乏全力支持
    • Windows:另外可能需要Python模块colorama要确保嵌套条位于各自的行内,请执行以下操作
  • Unicode:
    • 报告支持Unicode的环境将具有稳定、平滑的进度条。后备方案是一个ascii-仅限栏
    • Windows控制台通常只部分支持Unicode,因此often require explicit ascii=True(亦请参阅here)。这是因为普通宽度的Unicode字符错误地显示为“宽”,或者某些Unicode字符未呈现
  • 包裹生成器:
    • 生成器包装函数倾向于隐藏可迭代的长度tqdm不会
    • 替换tqdm(enumerate(...))使用enumerate(tqdm(...))tqdm(enumerate(x), total=len(x), ...)同样的道理也适用于numpy.ndenumerate
    • 替换tqdm(zip(a, b))使用zip(tqdm(a), b)甚至是zip(tqdm(a), tqdm(b))
    • 同样的道理也适用于itertools
    • 一些有用的方便函数可以在下面的tqdm.contrib
  • Hanging pipes in python2:使用时tqdm在CLI上,您可能需要使用Python 3.5+才能正确缓冲
  • No intermediate output in docker-compose:使用docker-compose run而不是docker-compose uptty: true

如果您遇到任何其他困难,请浏览并归档

Documentation

(自2016年5月19日起)

class tqdm():
  """
  Decorate an iterable object, returning an iterator which acts exactly
  like the original iterable, but prints a dynamically updating
  progressbar every time a value is requested.
  """

  def __init__(self, iterable=None, desc=None, total=None, leave=True,
               file=None, ncols=None, mininterval=0.1,
               maxinterval=10.0, miniters=None, ascii=None, disable=False,
               unit='it', unit_scale=False, dynamic_ncols=False,
               smoothing=0.3, bar_format=None, initial=0, position=None,
               postfix=None, unit_divisor=1000):

Parameters

  • 可迭代的:可迭代,可选
    可重复使用进度条进行装饰。保留为空可手动管理更新
  • 说明:字符串,可选
    进度栏的前缀
  • 总计:整型或浮点型,可选
    预期迭代次数。如果未指定,则在可能的情况下使用len(可迭代)。如果为FLOAT(“inf”)或作为最后手段,则仅显示基本进度统计信息(无ETA,无进度条)。如果gui为True并且此参数需要后续更新,请指定初始任意大正数,例如9e9
  • 离开吧:布尔值,可选
    如果为[default:true],则在迭代终止时保留进度条的所有痕迹。如果None,只有在以下情况下才会离开position0
  • 文件:io.TextIOWrapperio.StringIO,可选
    指定输出进度消息的位置(默认值:sys.stderr)。用途file.write(str)file.flush()方法。有关编码信息,请参见write_bytes
  • 乙二醇:整型,可选
    整个输出消息的宽度。如果指定,则动态调整进度条的大小以保持在此范围内。如果未指定,则尝试使用环境宽度。后备宽度为10米,对计数器和统计数据没有限制。如果为0,则不打印任何仪表(仅打印统计数据)
  • 最小间隔:浮动,可选
    最小进度显示更新间隔[默认值:0.1]秒
  • 最大间隔:浮动,可选
    最大进度显示更新间隔[默认值:10]秒。自动调整miniters与…相对应mininterval在长时间显示更新延迟之后。仅在以下情况下才有效dynamic_miniters或者启用了监视器线程
  • 小型矿车:整型或浮点型,可选
    最小进度显示更新间隔,以迭代为单位。如果为0且dynamic_miniters,将自动调整为等于mininterval(CPU效率更高,适用于紧密循环)。如果>0,将跳过指定迭代次数的显示。调整此选项,然后mininterval以获得非常有效的循环。如果快速迭代和慢速迭代(网络、跳过项目等)的进度都不稳定,则应该将miniters设置为1
  • ASCII:布尔值或字符串,可选
    如果未指定或为False,则使用Unicode(平滑块)填充仪表。备用方法是使用ASCII码字符“123456789#”
  • 禁用:布尔值,可选
    是否禁用整个进度栏包装[默认值:false]。如果设置为None,则在非TTY上禁用
  • 单位:字符串,可选
    将用于定义每个迭代的单位的字符串[默认值:it]
  • 单位_刻度:Bool、int或Float,可选
    如果为1或True,则迭代次数将自动减少/缩放,并将添加遵循国际单位制标准的公制前缀(千、兆等)[默认值:FALSE]。如果有任何其他非零数,将缩放totaln
  • 动态参数(_N):布尔值,可选
    如果设置,则会不断更改ncolsnrows到环境(允许调整窗口大小)[默认值:FALSE]
  • 平滑:浮动,可选
    速度估计的指数移动平均平滑系数(在GUI模式中忽略)。范围从0(平均速度)到1(当前/瞬时速度)[默认值:0.3]
  • 条形图格式(_F):字符串,可选
    指定自定义条形字符串格式。可能会影响性能。[默认值:‘{l_bar}{bar}{r_bar}’],其中l_bar=‘{desc}:{percentage:3.0f}%|’,r_bar=‘|{n_fmt}/{total_fmt}[{elapsed}<{reaving},’{rate_fmt}{postfix}]‘’可能的变量:l_bar,bar,r_bar,n,n_fmt,total,total_fmt,百分比,已用rate_noinv、rate_noinv_fmt、rate_inv、rate_inv_fmt、后缀、unit_ditor、剩余、剩余_s、eta。请注意,如果{desc}为空,则会在{desc}之后自动删除尾随的“:”
  • 首字母:整型或浮点型,可选
    初始计数器值。重新启动进度条时非常有用[默认值:0]。如果使用浮点,请考虑指定{n:.3f}或类似于bar_format,或指定unit_scale
  • 职位:整型,可选
    如果未指定,请指定自动打印此条形图的行偏移量(从0开始)。一次管理多个条形图非常有用(例如,从线程)
  • 后缀:DICT或*,可选
    指定要在条末尾显示的其他统计信息。呼叫set_postfix(**postfix)如果可能(DICT)
  • 单位_除数:浮动,可选
    [默认值:1000],除非忽略unit_scale是真的吗?
  • 写入字节(_B):布尔值,可选
    如果(默认值:无)和file未指定,则将使用Python 2写入字节。如果True还将写入字节。在所有其他情况下,将默认为Unicode
  • 锁定参数(_A):元组,可选
    已传递给refresh用于中间输出(初始化、迭代和更新)
  • n行:整型,可选
    屏幕高度。如果指定,则隐藏此边界之外的嵌套条。如果未指定,则尝试使用环境高度。退而求其次是20
  • 颜色:字符串,可选
    条形图颜色(例如“绿色”、“#00ff00”)
  • 延迟:浮动,可选
    在经过[默认值:0]秒之前不显示

Extra CLI Options

  • 神志不清:CHR,可选
    分隔字符[默认值:‘n’]。使用“0”表示NULL。注:在Windows系统上,Python将‘n’转换为‘rn’
  • buf_size:整型,可选
    字符串缓冲区大小(以字节为单位)[默认值:256]在以下情况下使用delim已指定
  • 字节数:布尔值,可选
    如果为true,将计算字节数,忽略delim和Defaultunit_scale为了真的,unit_divisor设置为1024,并且unit到“B”
  • T形三通:布尔值,可选
    如果为true,则通过stdin对两个人都是stderrstdout
  • 更新:布尔值,可选
    如果为true,则将输入视为新经过的迭代,即要传递到的数字update()请注意,这很慢(~2e5 it/s),因为每个输入都必须解码为数字
  • 更新目标(_T):布尔值,可选
    如果为true,则将输入视为已用迭代总数,即要分配给的数字self.n请注意,这很慢(~2e5 it/s),因为每个输入都必须解码为数字
  • 空:布尔值,可选
    如果为true,将丢弃输入(无标准输出)
  • 人工路径:字符串,可选
    要安装tqdm手册页的目录
  • 压缩路径:字符串,可选
    放置tqdm完成的目录
  • 日志:字符串,可选
    严重|致命|错误|警告(ING)|[默认值:‘INFO’]|DEBUG|NOTSET

Returns

  • 输出:修饰迭代器
class tqdm():
  def update(self, n=1):
      """
      Manually update the progress bar, useful for streams
      such as reading files.
      E.g.:
      >>> t = tqdm(total=filesize) # Initialise
      >>> for current_buffer in stream:
      ...    ...
      ...    t.update(len(current_buffer))
      >>> t.close()
      The last line is highly recommended, but possibly not necessary if
      ``t.update()`` will be called in such a way that ``filesize`` will be
      exactly reached and printed.

      Parameters
      ----------
      n  : int or float, optional
          Increment to add to the internal counter of iterations
          [default: 1]. If using float, consider specifying ``{n:.3f}``
          or similar in ``bar_format``, or specifying ``unit_scale``.

      Returns
      -------
      out  : bool or None
          True if a ``display()`` was triggered.
      """

  def close(self):
      """Cleanup and (if leave=False) close the progressbar."""

  def clear(self, nomove=False):
      """Clear current bar display."""

  def refresh(self):
      """
      Force refresh the display of this bar.

      Parameters
      ----------
      nolock  : bool, optional
          If ``True``, does not lock.
          If [default: ``False``]: calls ``acquire()`` on internal lock.
      lock_args  : tuple, optional
          Passed to internal lock's ``acquire()``.
          If specified, will only ``display()`` if ``acquire()`` returns ``True``.
      """

  def unpause(self):
      """Restart tqdm timer from last print time."""

  def reset(self, total=None):
      """
      Resets to 0 iterations for repeated use.

      Consider combining with ``leave=True``.

      Parameters
      ----------
      total  : int or float, optional. Total to use for the new bar.
      """

  def set_description(self, desc=None, refresh=True):
      """
      Set/modify description of the progress bar.

      Parameters
      ----------
      desc  : str, optional
      refresh  : bool, optional
          Forces refresh [default: True].
      """

  def set_postfix(self, ordered_dict=None, refresh=True, **tqdm_kwargs):
      """
      Set/modify postfix (additional stats)
      with automatic formatting based on datatype.

      Parameters
      ----------
      ordered_dict  : dict or OrderedDict, optional
      refresh  : bool, optional
          Forces refresh [default: True].
      kwargs  : dict, optional
      """

  @classmethod
  def write(cls, s, file=sys.stdout, end="\n"):
      """Print a message via tqdm (without overlap with bars)."""

  @property
  def format_dict(self):
      """Public API for read-only member access."""

  def display(self, msg=None, pos=None):
      """
      Use ``self.sp`` to display ``msg`` in the specified ``pos``.

      Consider overloading this function when inheriting to use e.g.:
      ``self.some_frontend(**self.format_dict)`` instead of ``self.sp``.

      Parameters
      ----------
      msg  : str, optional. What to display (default: ``repr(self)``).
      pos  : int, optional. Position to ``moveto``
        (default: ``abs(self.pos)``).
      """

  @classmethod
  @contextmanager
  def wrapattr(cls, stream, method, total=None, bytes=True, **tqdm_kwargs):
      """
      stream  : file-like object.
      method  : str, "read" or "write". The result of ``read()`` and
          the first argument of ``write()`` should have a ``len()``.

      >>> with tqdm.wrapattr(file_obj, "read", total=file_obj.size) as fobj:
      ...     while True:
      ...         chunk = fobj.read(chunk_size)
      ...         if not chunk:
      ...             break
      """

  @classmethod
  def pandas(cls, *targs, **tqdm_kwargs):
      """Registers the current `tqdm` class with `pandas`."""

def trange(*args, **tqdm_kwargs):
    """
    A shortcut for `tqdm(xrange(*args), **tqdm_kwargs)`.
    On Python3+, `range` is used instead of `xrange`.
    """

Convenience Functions

def tqdm.contrib.tenumerate(iterable, start=0, total=None,
                            tqdm_class=tqdm.auto.tqdm, **tqdm_kwargs):
    """Equivalent of `numpy.ndenumerate` or builtin `enumerate`."""

def tqdm.contrib.tzip(iter1, *iter2plus, **tqdm_kwargs):
    """Equivalent of builtin `zip`."""

def tqdm.contrib.tmap(function, *sequences, **tqdm_kwargs):
    """Equivalent of builtin `map`."""

Submodules

class tqdm.notebook.tqdm(tqdm.tqdm):
    """IPython/Jupyter Notebook widget."""

class tqdm.auto.tqdm(tqdm.tqdm):
    """Automatically chooses beween `tqdm.notebook` and `tqdm.tqdm`."""

class tqdm.asyncio.tqdm(tqdm.tqdm):
  """Asynchronous version."""
  @classmethod
  def as_completed(cls, fs, *, loop=None, timeout=None, total=None,
                   **tqdm_kwargs):
      """Wrapper for `asyncio.as_completed`."""

class tqdm.gui.tqdm(tqdm.tqdm):
    """Matplotlib GUI version."""

class tqdm.tk.tqdm(tqdm.tqdm):
    """Tkinter GUI version."""

class tqdm.rich.tqdm(tqdm.tqdm):
    """`rich.progress` version."""

class tqdm.keras.TqdmCallback(keras.callbacks.Callback):
    """Keras callback for epoch and batch progress."""

class tqdm.dask.TqdmCallback(dask.callbacks.Callback):
    """Dask callback for task progress."""

contrib

这个tqdm.contrib软件包还包含实验模块:

  • tqdm.contrib.itertools:周围有薄薄的包装纸itertools
  • tqdm.contrib.concurrent:周围有薄薄的包装纸concurrent.futures
  • tqdm.contrib.discord:发布到Discord机器人
  • tqdm.contrib.telegram:发布到Telegram机器人
  • tqdm.contrib.bells:自动启用所有可选功能
    • autopandasdiscordtelegram

Examples and Advanced Usage

Description and additional stats

自定义信息可以在上动态显示和更新tqdm带有条形图的条形图descpostfix参数:

from tqdm import tqdm, trange
from random import random, randint
from time import sleep

with trange(10) as t:
    for i in t:
        # Description will be displayed on the left
        t.set_description('GEN %i' % i)
        # Postfix will be displayed on the right,
        # formatted automatically based on argument's datatype
        t.set_postfix(loss=random(), gen=randint(1,999), str='h',
                      lst=[1, 2])
        sleep(0.1)

with tqdm(total=10, bar_format="{postfix[0]} {postfix[1][value]:>8.2g}",
          postfix=["Batch", dict(value=0)]) as t:
    for i in range(10):
        sleep(0.1)
        t.postfix[1]["value"] = i / 2
        t.update()

使用时要记住的要点{postfix[...]}bar_format字符串:

  • postfix还需要以兼容格式作为初始参数传递,并且
  • postfix将自动转换为字符串(如果它是dict-类物体。要防止此行为,请在键不是字符串的字典中插入额外的项

附加内容bar_format参数也可以通过重写format_dict,并且可以使用以下命令修改栏本身ascii

from tqdm import tqdm
class TqdmExtraFormat(tqdm):
    """Provides a `total_time` format parameter"""
    @property
    def format_dict(self):
        d = super(TqdmExtraFormat, self).format_dict
        total_time = d["elapsed"] * (d["total"] or 0) / max(d["n"], 1)
        d.update(total_time=self.format_interval(total_time) + " in total")
        return d

for i in TqdmExtraFormat(
      range(9), ascii=" .oO0",
      bar_format="{total_time}: {percentage:.0f}%|{bar}{r_bar}"):
    if i == 4:
        break
00:00 in total: 44%|0000.     | 4/9 [00:00<00:00, 962.93it/s]

请注意,{bar}还支持格式说明符[width][type]

  • width
    • 未指定(默认):自动填充ncols
    • int >= 0:固定宽度替代ncols逻辑
    • int < 0:从自动缺省值中减去
  • type
    • a:ASCII(ascii=True覆盖)
    • u:unicode(ascii=False覆盖)
    • b:空白(ascii=" "覆盖)

这意味着可以使用以下方法创建具有右对齐文本的固定栏:bar_format="{l_bar}{bar:10}|{bar:-10b}right-justified"

Nested progress bars

tqdm支持嵌套进度条。下面是一个示例:

from tqdm.auto import trange
from time import sleep

for i in trange(4, desc='1st loop'):
    for j in trange(5, desc='2nd loop'):
        for k in trange(50, desc='3rd loop', leave=False):
            sleep(0.01)

要手动控制定位(例如,用于多处理),您可以指定position=n哪里n=0对于最外面的酒吧,n=1下一个,以此类推。不过,最好还是检查一下tqdm无需手动即可工作position第一

from time import sleep
from tqdm import trange, tqdm
from multiprocessing import Pool, RLock, freeze_support

L = list(range(9))

def progresser(n):
    interval = 0.001 / (n + 2)
    total = 5000
    text = "#{}, est. {:<04.2}s".format(n, interval * total)
    for _ in trange(total, desc=text, position=n):
        sleep(interval)

if __name__ == '__main__':
    freeze_support()  # for Windows support
    tqdm.set_lock(RLock())  # for managing output contention
    p = Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))
    p.map(progresser, L)

请注意,在Python3中,tqdm.write是否线程安全:

from time import sleep
from tqdm import tqdm, trange
from concurrent.futures import ThreadPoolExecutor

L = list(range(9))

def progresser(n):
    interval = 0.001 / (n + 2)
    total = 5000
    text = "#{}, est. {:<04.2}s".format(n, interval * total)
    for _ in trange(total, desc=text):
        sleep(interval)
    if n == 6:
        tqdm.write("n == 6 completed.")
        tqdm.write("`tqdm.write()` is thread-safe in py3!")

if __name__ == '__main__':
    with ThreadPoolExecutor() as p:
        p.map(progresser, L)

Hooks and callbacks

tqdm可以轻松支持回调/挂钩和手动更新。下面是一个包含以下内容的示例urllib

“urllib.urlsearche“文档

[.]
如果存在,将调用一次钩子函数
关于网络连接的建立和每次挡路阅读后的一次
之后。将向挂钩传递三个参数;块计数
到目前为止已传输的挡路大小(以字节为单位)和文件的总大小
[.]
import urllib, os
from tqdm import tqdm
urllib = getattr(urllib, 'request', urllib)

class TqdmUpTo(tqdm):
    """Provides `update_to(n)` which uses `tqdm.update(delta_n)`."""
    def update_to(self, b=1, bsize=1, tsize=None):
        """
        b  : int, optional
            Number of blocks transferred so far [default: 1].
        bsize  : int, optional
            Size of each block (in tqdm units) [default: 1].
        tsize  : int, optional
            Total size (in tqdm units). If [default: None] remains unchanged.
        """
        if tsize is not None:
            self.total = tsize
        return self.update(b * bsize - self.n)  # also sets self.n = b * bsize

eg_link = "https://caspersci.uk.to/matryoshka.zip"
with TqdmUpTo(unit='B', unit_scale=True, unit_divisor=1024, miniters=1,
              desc=eg_link.split('/')[-1]) as t:  # all optional kwargs
    urllib.urlretrieve(eg_link, filename=os.devnull,
                       reporthook=t.update_to, data=None)
    t.total = t.n

灵感来自twine#242中的功能替代examples/tqdm_wget.py

建议使用miniters=1每当迭代速度存在潜在较大差异时(例如,通过补丁连接下载文件)

包装读/写方法

要通过类似文件的对象测量吞吐量,请执行以下操作readwrite方法,使用CallbackIOWrapper

from tqdm.auto import tqdm
from tqdm.utils import CallbackIOWrapper

with tqdm(total=file_obj.size,
          unit='B', unit_scale=True, unit_divisor=1024) as t:
    fobj = CallbackIOWrapper(t.update, file_obj, "read")
    while True:
        chunk = fobj.read(chunk_size)
        if not chunk:
            break
    t.reset()
    # ... continue to use `t` for something else

或者,使用更简单的wrapattr便利函数,该函数将压缩两个urllibCallbackIOWrapper下面是示例:

import urllib, os
from tqdm import tqdm

eg_link = "https://caspersci.uk.to/matryoshka.zip"
response = getattr(urllib, 'request', urllib).urlopen(eg_link)
with tqdm.wrapattr(open(os.devnull, "wb"), "write",
                   miniters=1, desc=eg_link.split('/')[-1],
                   total=getattr(response, 'length', None)) as fout:
    for chunk in response:
        fout.write(chunk)

这个requests等价物几乎完全相同:

import requests, os
from tqdm import tqdm

eg_link = "https://caspersci.uk.to/matryoshka.zip"
response = requests.get(eg_link, stream=True)
with tqdm.wrapattr(open(os.devnull, "wb"), "write",
                   miniters=1, desc=eg_link.split('/')[-1],
                   total=int(response.headers.get('content-length', 0))) as fout:
    for chunk in response.iter_content(chunk_size=4096):
        fout.write(chunk)

自定义回调

tqdm以智能地跳过不必要的显示而闻名。要使自定义回调利用这一点,只需使用update()这设置为True如果一个display()已被触发

from tqdm.auto import tqdm as std_tqdm

def external_callback(*args, **kwargs):
    ...

class TqdmExt(std_tqdm):
    def update(self, n=1):
        displayed = super(TqdmExt, self).update(n):
        if displayed:
            external_callback(**self.format_dict)
        return displayed

asyncio

请注意,break当前未被异步迭代器捕获。这意味着tqdm在这种情况下,无法自行清理:

from tqdm.asyncio import tqdm

async for i in tqdm(range(9)):
    if i == 2:
        break

取而代之的是,或者调用pbar.close()手动或使用上下文管理器语法:

from tqdm.asyncio import tqdm

with tqdm(range(9)) as pbar:
    async for i in pbar:
        if i == 2:
            break

Pandas Integration

由于大众的需求,我们增加了对pandas–这里有一个例子DataFrame.progress_applyDataFrameGroupBy.progress_apply

import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))

# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`
# (can use `tqdm.gui.tqdm`, `tqdm.notebook.tqdm`, optional kwargs, etc.)
tqdm.pandas(desc="my bar!")

# Now you can use `progress_apply` instead of `apply`
# and `progress_map` instead of `map`
df.progress_apply(lambda x: x**2)
# can also groupby:
# df.groupby(0).progress_apply(lambda x: x**2)

如果您对这是如何工作的(以及如何为您自己的回调修改它)感兴趣,请参阅examples文件夹或导入模块,然后运行help()

Keras Integration

一个keras也可以回调:

from tqdm.keras import TqdmCallback

...

model.fit(..., verbose=0, callbacks=[TqdmCallback()])

Dask Integration

一个dask也可以回调:

from tqdm.dask import TqdmCallback

with TqdmCallback(desc="compute"):
    ...
    arr.compute()

# or use callback globally
cb = TqdmCallback(desc="global")
cb.register()
arr.compute()

IPython/Jupyter Integration

IPython/Jupyter通过tqdm.notebook子模块:

from tqdm.notebook import trange, tqdm
from time import sleep

for i in trange(3, desc='1st loop'):
    for j in tqdm(range(100), desc='2nd loop'):
        sleep(0.01)

除了……之外tqdm功能方面,该子模块提供原生Jupyter小部件(与IPythonv1-v4和Jupyter兼容)、完全工作的嵌套条和颜色提示(蓝色:正常、绿色:已完成、红色:错误/中断、浅蓝色:无ETA);如下所示



这个notebook版本支持总宽度的百分比或像素(例如:ncols='100%'ncols='480px')

也可以让tqdm自动选择控制台或笔记本电脑版本,方法是使用autonotebook子模块:

from tqdm.autonotebook import tqdm
tqdm.pandas()

请注意,这将发出一个TqdmExperimentalWarning如果在笔记本中运行,因为它不能区分jupyter notebookjupyter console使用auto而不是autonotebook要取消显示此警告,请执行以下操作

请注意,笔记本将在创建它的单元格中显示该条。这可能是与使用它的单元格不同的单元格。如果这也不是我们想要的,

  • 将栏的创建延迟到必须显示它的单元格,或者
  • 使用创建条形图display=False,并且在稍后的蜂窝呼叫中display(bar.container)
from tqdm.notebook import tqdm
pbar = tqdm(..., display=False)
# different cell
display(pbar.container)

这个keras回调有一个display()同样可以使用的方法:

from tqdm.keras import TqdmCallback
cbk = TqdmCallback(display=False)
# different cell
cbk.display()
model.fit(..., verbose=0, callbacks=[cbk])

另一种可能是拥有一个不断重复使用的条(靠近笔记本顶部)(使用reset()而不是close())。因此,笔记本版本(与CLI版本不同)不会自动调用close()在此基础上Exception

from tqdm.notebook import tqdm
pbar = tqdm()
# different cell
iterable = range(100)
pbar.reset(total=len(iterable))  # initialise with new `total`
for i in iterable:
    pbar.update()
pbar.refresh()  # force print final status but don't `close()`

Custom Integration

要更改默认参数(如进行dynamic_ncols=True),只需使用内置的Python魔术:

from functools import partial
from tqdm import tqdm as std_tqdm
tqdm = partial(std_tqdm, dynamic_ncols=True)

要进一步自定义,请参见tqdm可以从继承以创建自定义回调(与TqdmUpTo示例above)或用于自定义前端(例如,诸如笔记本或绘图包之类的GUI)。在后一种情况下:

  1. def __init__()要呼叫,请执行以下操作super().__init__(..., gui=True)禁用端子的步骤status_printer创作
  2. 重新定义:close()clear()display()

考虑超载display()使用,例如,使用self.frontend(**self.format_dict)而不是self.sp(repr(self))

继承的一些子模块示例:

Dynamic Monitor/Meter

您可以使用tqdm作为一个不是单调递增的韵律。这可能是因为n减少(例如CPU使用情况监视器)或total变化

递归搜索文件就是一个例子。这个total是到目前为止找到的对象数,而n是属于文件(而不是文件夹)的那些对象的数量:

from tqdm import tqdm
import os.path

def find_files_recursively(path, show_progress=True):
    files = []
    # total=1 assumes `path` is a file
    t = tqdm(total=1, unit="file", disable=not show_progress)
    if not os.path.exists(path):
        raise IOError("Cannot find:" + path)

    def append_found_file(f):
        files.append(f)
        t.update()

    def list_found_dir(path):
        """returns os.listdir(path) assuming os.path.isdir(path)"""
        listing = os.listdir(path)
        # subtract 1 since a "file" we found was actually this directory
        t.total += len(listing) - 1
        # fancy way to give info without forcing a refresh
        t.set_postfix(dir=path[-10:], refresh=False)
        t.update(0)  # may trigger a refresh
        return listing

    def recursively_search(path):
        if os.path.isdir(path):
            for f in list_found_dir(path):
                recursively_search(os.path.join(path, f))
        else:
            append_found_file(path)

    recursively_search(path)
    t.set_postfix(dir=path)
    t.close()
    return files

使用update(0)是一种方便的方式来让tqdm决定何时触发显示刷新以避免控制台垃圾邮件

Writing messages

这是一项正在进行的工作(请参见#737)

因为tqdm使用简单的打印机制显示进度条,您不应该在终端中使用print()当进度条打开时

在终端中写入消息而不与其发生任何冲突tqdm条形图显示,a.write()提供了一种方法:

from tqdm.auto import tqdm, trange
from time import sleep

bar = trange(10)
for i in bar:
    # Print using tqdm class method .write()
    sleep(0.1)
    if not (i % 3):
        tqdm.write("Done task %i" % i)
    # Can also use bar.write()

默认情况下,这将打印到标准输出sys.stdout但是您可以使用file论点。例如,这可用于将写入日志文件或类的消息重定向

Redirecting writing

如果使用可以将消息打印到控制台的库,请通过替换print()使用tqdm.write()可能不是我们想要的。在这种情况下,重定向sys.stdouttqdm.write()是一种选择

要重定向,请执行以下操作sys.stdout,创建一个类似文件的类,该类将把任何输入字符串写入tqdm.write(),并提供参数file=sys.stdout, dynamic_ncols=True

下面给出了一个可重用的规范示例:

from time import sleep
import contextlib
import sys
from tqdm import tqdm
from tqdm.contrib import DummyTqdmFile


@contextlib.contextmanager
def std_out_err_redirect_tqdm():
    orig_out_err = sys.stdout, sys.stderr
    try:
        sys.stdout, sys.stderr = map(DummyTqdmFile, orig_out_err)
        yield orig_out_err[0]
    # Relay exceptions
    except Exception as exc:
        raise exc
    # Always restore sys.stdout/err if necessary
    finally:
        sys.stdout, sys.stderr = orig_out_err

def some_fun(i):
    print("Fee, fi, fo,".split()[i])

# Redirect stdout to tqdm.write() (don't forget the `as save_stdout`)
with std_out_err_redirect_tqdm() as orig_stdout:
    # tqdm needs the original stdout
    # and dynamic_ncols=True to autodetect console width
    for i in tqdm(range(3), file=orig_stdout, dynamic_ncols=True):
        sleep(.5)
        some_fun(i)

# After the `with`, printing is restored
print("Done!")

Redirecting logging

类似于sys.stdout/sys.stderr如上所述,控制台logging也可以重定向到tqdm.write()

警告:如果还重定向sys.stdout/sys.stderr,请务必重定向logging如果需要,先来

中提供了帮助器方法tqdm.contrib.logging例如:

import logging
from tqdm import trange
from tqdm.contrib.logging import logging_redirect_tqdm

LOG = logging.getLogger(__name__)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    with logging_redirect_tqdm():
        for i in trange(9):
            if i == 4:
                LOG.info("console logging redirected to `tqdm.write()`")
    # logging restored

Monitoring thread, intervals and miniters

tqdm实施一些技巧来提高效率和降低管理费用

  • 避免不必要的频繁条刷新:mininterval定义每次刷新之间等待的时间。tqdm始终在后台更新,但它将仅在mininterval
  • 减少检查系统时钟/时间的调用次数
  • mininterval比起配置更直观miniters巧妙的调整系统dynamic_miniters将自动调整miniters与时间相适应的迭代次数mininterval从本质上讲,tqdm将在不实际检查时间的情况下检查是否到了打印时间。通过手动设置,仍可绕过此行为miniters

但是,请考虑快速迭代和慢速迭代相结合的情况。在几次快速迭代之后,dynamic_miniters将设置miniters变成了一个大数目。当迭代速率随后减慢时,miniters将保持较大,从而降低显示更新频率。要解决此问题,请执行以下操作:

  • maxinterval定义显示刷新之间的最长时间。并发监视线程检查过期的更新,并在必要时强制更新

监视线程不应该有明显的开销,并且默认情况下保证至少每10秒更新一次。该值可以通过设置monitor_interval任何tqdm实例(即t = tqdm.tqdm(...); t.monitor_interval = 2)。可以通过设置在应用程序范围内禁用监视线程tqdm.tqdm.monitor_interval = 0在实例化任何tqdm钢筋

Merch

你可以买到tqdm branded merch现在!

Contributions

所有源代码都托管在GitHub欢迎投稿

请参阅CONTRIBUTING有关详细信息,请参阅文件

做出重大贡献的开发人员,按SLOC(幸存的代码行,git fame-wMC --excl '\.(png|gif|jpg)$'),包括:

名字 ID号 SLOC 注意事项
卡斯珀·达·科斯塔-路易斯 casperdcl ~81% 主要维护人员
斯蒂芬·拉罗克 lrq3000 ~10% 团队成员
马丁·祖格诺尼 martinzugnoni ~3% 他说:
理查德·谢里登 richardsheridan ~1% 他说:
陈广硕 chengs ~1% 他说:
凯尔·阿尔滕多夫 altendky <1% 他说:
马修·史蒂文斯 mjstevens777 <1% 他说:
哈德琳·玛丽 hadim <1% 团队成员
伊万·伊万诺夫 obiwanus <1% 他说:
丹尼尔·潘特莱特 danielpanteleit <1% 他说:
乔纳斯·哈格 jonashaag <1% 他说:
詹姆斯·E·金三世 jeking3 <1% 他说:
诺姆·约拉夫-拉斐尔 noamraph <1% 原作者
米哈伊尔·科罗博夫 kmike <1% 团队成员

Ports to Other Languages

有关列表,请访问this wiki page

LICENCE

开源(OSI批准):

引文信息:

(自2016年5月19日起)

Redash-让您的公司实现数据驱动。连接到任何数据源,轻松可视化、控制面板和共享您的数据

Redash旨在让任何人,无论技术复杂程度如何,都能利用大大小小数据的力量。SQL用户可以利用Redash来浏览、查询、可视化和共享来自任何数据源的数据。反过来,他们的工作使其组织中的任何人都可以使用这些数据。每天,世界各地数千个组织的数百万用户使用Redash开发洞察力并做出数据驱动的决策

Redash功能:

  1. 基于浏览器:浏览器中的所有内容,都有可共享的URL
  2. 易用性:立即利用数据提高工作效率,无需掌握复杂的软件
  3. 查询编辑器:使用架构浏览器和自动完成功能快速编写SQL和NoSQL查询
  4. 可视化和控制面板:创建beautiful visualizations拖放,并将它们组合到单个仪表板中
  5. 共享:通过共享可视化及其相关查询轻松协作,实现报告和查询的同行审查
  6. 计划刷新:按您定义的定期间隔自动更新图表和仪表板
  7. 警报:定义条件,并在数据更改时立即发出警报
  8. 睡觉接口:UI中可以做的一切也通过睡觉接口提供
  9. 对数据源的广泛支持:可扩展的数据源API,具有对一长串常用数据库和平台的本机支持

快速入门

支持的数据源

Redash支持超过35个SQL和NoSQLdata sources它还可以扩展以支持更多内容。以下是内置源的列表:

  • 亚马逊雅典娜
  • Amazon DynamoDB
  • 亚马逊红移
  • Axibase时间序列数据库
  • 卡桑德拉
  • ClickHouse
  • CockroachDB
  • CSV
  • 数据库(阿帕奇电光)
  • IBM的DB2
  • 德鲁伊
  • ES
  • 谷歌分析
  • Google BigQuery
  • 谷歌电子表格
  • 石墨
  • 绿梅
  • Hive
  • 黑斑羚
  • InfluxDB
  • JIRA
  • JSON
  • 阿帕奇麒麟
  • OmniSciDB(前身为MAPD)
  • MemSQL
  • Microsoft Azure数据仓库/Synapse
  • Microsoft Azure SQL数据库
  • Microsoft SQL Server
  • MongoDB
  • MySQL
  • 甲骨文
  • PostgreSQL
  • 普罗米修斯
  • python
  • 夸博尔
  • 岩石集
  • Salesforce
  • ScyllaDB
  • Shell脚本
  • 雪花
  • SQLite
  • TiDB
  • 财务数据
  • 垂直方向
  • Yandex AppMetrrica
  • Yandex Metrica

获取帮助

报告错误和贡献代码

  • 想要报告错误或请求功能吗?请打开an issue
  • 想要帮助我们建造雷达什?分叉项目,在dev environment并提出拉取请求。我们需要所有能得到的帮助!

安全性

请发电子邮件给我security@redash.io报告任何安全漏洞。我们将确认收到您的漏洞,并努力定期向您发送有关我们进度的最新信息。如果您对您的信息披露情况感到好奇,请随时再次向我们发送电子邮件。如果您想要加密您的披露电子邮件,您可以使用this PGP key

许可证

BSD-2-条款

Algorithms-Python中数据结构和算法的最小示例

Python数据结构和算法

Python3中数据结构和算法的最小且干净的示例实现

贡献

感谢您对投稿的兴趣!有很多方式可以为这个项目做出贡献。Get started here

测试

使用单元测试

要运行所有测试,请写下:

$ python3 -m unittest discover tests

要运行某些特定测试,您可以执行以下操作(例如:排序):

$ python3 -m unittest tests.test_sort

使用pytest

要运行所有测试,请写下:

$ python3 -m pytest tests

安装

如果您想在代码中使用API算法,只需如下所示:

$ pip3 install algorithms

您可以通过创建一个python文件进行测试:(例如:USEmerge_sort在……里面sort)

from algorithms.sort import merge_sort

if __name__ == "__main__":
    my_list = [1, 8, 3, 5, 6]
    my_list = merge_sort(my_list)
    print(my_list)

卸载

如果要卸载算法,只需执行以下操作:

$ pip3 uninstall -y algorithms

实现列表

贡献者

感谢all the contributors帮助建立回购的人

Python-fire 一个用于从任何Python对象自动生成命令行界面(CLI)的库

Python Fire是一个用于从任何Python对象自动生成命令行界面(CLI)的库

  • Python Fire是在Python中创建CLI的简单方法[1]
  • Python Fire是开发和调试Python代码的有用工具[2]
  • Python Fire有助于探索现有代码或将其他人的代码转换为CLI。[3]
  • Python Fire使Bash和Python之间的转换变得更容易[4]
  • Python Fire使用已导入和创建的模块和变量设置REPL,从而简化了Python REPL的使用[5]

安装

要使用pip安装Python Fire,请运行:pip install fire

要使用Conda安装Python Fire,请运行:conda install fire -c conda-forge

要从源安装Python Fire,请首先克隆存储库,然后运行:python setup.py install

基本用法

你可以打电话给Fire在任何Python对象上:
函数、类、模块、对象、字典、列表、元组等,它们都可以工作!

以下是在函数上调用Fire的示例

import fire

def hello(name="World"):
  return "Hello %s!" % name

if __name__ == '__main__':
  fire.Fire(hello)

然后,您可以从命令行运行:

python hello.py  # Hello World!
python hello.py --name=David  # Hello David!
python hello.py --help  # Shows usage information.

以下是在类上调用Fire的示例

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

然后,您可以从命令行运行:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

要了解Fire在函数、对象、字典、列表等上的行为,并了解Fire的其他功能,请参阅Using a Fire CLI page

有关其他示例,请参见The Python Fire Guide

为什么叫“火”呢?

当你打电话给Fire,它会触发(执行)您的命令

我在哪里可以了解更多?

请看The Python Fire Guide

参考文献

设置 命令 注意事项
安装 pip install fire
创建CLI 命令 注意事项
导入 import fire
打电话 fire.Fire() 将当前模块转换为Fire CLI
打电话 fire.Fire(component) 转弯component变成Fire CLI
使用CLI 命令 注意事项
Help command --helpcommand -- --help
REPL command -- --interactive 进入交互模式
Separator command -- --separator=X 将分隔符设置为X默认分隔符是-
Completion command -- --completion [shell] 为CLI生成完成脚本
Trace command -- --trace 获取该命令的火灾跟踪
Verbose command -- --verbose

请注意,这些标志与消防命令之间由独立的--

许可证

根据Apache 2.0许可证

免责声明

这不是谷歌的官方产品

Tornado-Tornado是一个Python Web框架和异步网络库

Tornado是一个Python Web框架和异步网络库,最初是在FriendFeed通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,这使得它非常适合long pollingWebSockets,以及需要与每个用户建立长期连接的其他应用程序

你好,世界

这里是一个简单的“你好,世界”的旋风示例网络应用程序:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

此示例没有使用Tornado的任何异步特性;有关这一点,请参阅simple chat room

文档

有关其他资源的文档和链接,请访问https://www.tornadoweb.org

Sqlmap-自动SQL注入和数据库工具

sqlmap是一款开源渗透测试工具,可自动检测和利用SQL注入缺陷并接管数据库服务器。它具有强大的检测引擎、许多适用于终极渗透测试仪的利基功能,以及广泛的交换机,包括数据库指纹、通过从数据库提取数据、访问底层文件系统以及通过带外连接在操作系统上执行命令

屏幕截图

您可以访问collection of screenshots演示维基上的一些功能

安装

您可以通过单击下载最新的tarballhere或最新的Zipball,请单击here

最好,您可以通过克隆sqlmap来下载sqlmap。Git存储库:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

sqlmap开箱即用Python版本2.62.73.x在任何平台上

用法

要获取基本选项和开关的列表,请使用:

python sqlmap.py -h

要获取所有选项和开关的列表,请使用:

python sqlmap.py -hh

您可以找到一个示例运行here要获得sqlmap功能的概述、支持的功能列表、所有选项和开关的说明以及示例,建议您参阅user’s manual

链接

译本

Interactive-coding-challenges-120+交互式Python编码面试挑战(算法和数据结构)

交互式编码-挑战

120多项持续更新、交互式和测试驱动的编码挑战,具有Anki flashcards

挑战集中在算法数据结构在以下位置找到编码面试

每个挑战都有一个或多个参考解决方案,它们是:

  • 全功能
  • 单元测试
  • 通俗易懂

Challenges将很快提供按需服务incremental hints以帮助您获得最佳解决方案

笔记本还详细介绍了:

  • 约束条件
  • 测试用例
  • 算法
  • 大O时空复杂性

还包括单元测试的参考实现各式各样的data structuresalgorithms

挑战解决方案

Anki抽认卡:编码与设计

提供的Anki flashcard deck使用间隔重复来帮助您记住关键概念

非常适合在旅途中使用

设计资源:系统设计入门

寻找资源来帮助您准备系统设计面向对象的设计访谈

查看姊妹回购The System Design Primer,其中包含其他Anki甲板:

笔记本结构

每个挑战有两个笔记本,一个挑战笔记本有要解决的单元测试和解决方案笔记本以供参考

问题陈述

  • 陈述要解决的问题

约束条件

  • 描述任何约束或假设。

测试用例

  • 描述将在单元测试中评估的常规测试用例和边缘测试用例。

算法

  • [挑战笔记本]空,如果需要提示,请参阅解决方案笔记本算法部分
  • [解决方案笔记本]一个或多个算法方案讨论,时间和空间复杂度大O

提示

  • [挑战笔记本]提供按需服务incremental hints来帮助你找到最优的解决方案。马上就来!

代码(挑战:实现我!)

  • [挑战笔记本]供您实现的骨架代码
  • [解决方案笔记本]一个或多个参考解决方案

单元测试

  • [挑战笔记本]代码的单元测试。预计在你解决挑战之前都会失败
  • [解决方案笔记本]参考解决方案的单元测试

索引

挑战类别

格式化:挑战类别-挑战数量

挑战总数:120项

参考实现:数据结构

以下数据结构经过单元测试、功能齐全的实现:

参考实现:算法

以下算法经过单元测试、功能齐全的实现:

参考实现:TODO

安装和运行挑战

杂项

挑战

Image Credits

数组和字符串

挑战 静电笔记本
确定字符串是否包含唯一字符 ChallengeSolution
确定一个字符串是否为另一个字符串的排列 ChallengeSolution
确定一个字符串是否为另一个字符串的旋转 ChallengeSolution
压缩字符串 ChallengeSolution
颠倒字符串中的字符 ChallengeSolution
给定两个字符串,找到单个不同的字符 ChallengeSolution
查找两个总和为特定值的索引 ChallengeSolution
实现哈希表 ChallengeSolution
实施冒泡嗡嗡声 ChallengeSolution
查找字符串中的第一个非重复字符 ContributeContribute
删除字符串中的指定字符 ContributeContribute
颠倒字符串中的单词 ContributeContribute
将字符串转换为整数 ContributeContribute
将整数转换为字符串 ContributeContribute
添加质询 ContributeContribute

链表

挑战 静电笔记本
从链接列表中删除重复项 ChallengeSolution
查找链表最后一个元素的第k个元素 ChallengeSolution
删除链表中间的节点 ChallengeSolution
围绕给定值对链表进行分区 ChallengeSolution
将数字存储在链表中的两个数字相加 ChallengeSolution
查找链接列表循环的起点 ChallengeSolution
确定链表是否为回文 ChallengeSolution
实现链表 ChallengeSolution
确定列表是循环的还是非循环的 ContributeContribute
添加质询 ContributeContribute

堆栈和队列

挑战 静电笔记本
使用单个数组实施n个堆栈 ChallengeSolution
实现跟踪其最小元素的堆栈 ChallengeSolution
实现包装容量受限堆栈列表的一组Stacks类 ChallengeSolution
使用两个堆栈实现一个队列 ChallengeSolution
使用另一个堆栈作为缓冲区对堆栈进行排序 ChallengeSolution
实现堆栈 ChallengeSolution
实现一个队列 ChallengeSolution
实现由数组支持的优先级队列 ChallengeSolution
添加质询 ContributeContribute

图形和树

挑战 静电笔记本
在树上实现深度优先搜索(前、中、后顺序) ChallengeSolution
实现树的广度优先搜索 ChallengeSolution
确定树的高度 ChallengeSolution
从排序数组创建高度最小的二叉搜索树 ChallengeSolution
为二叉树的每个级别创建链表 ChallengeSolution
检查二叉树是否平衡 ChallengeSolution
确定树是否为有效的二叉搜索树 ChallengeSolution
在二叉搜索树中查找给定节点的有序后继节点 ChallengeSolution
查找二叉树中的第二大节点 ChallengeSolution
找到最底层的共同祖先 ChallengeSolution
反转二叉树 ChallengeSolution
实现二叉搜索树 ChallengeSolution
实现最小堆 ChallengeSolution
实现Trie ChallengeSolution
在图上实现深度优先搜索 ChallengeSolution
实现图的广度优先搜索 ChallengeSolution
确定图中的两个节点之间是否存在路径 ChallengeSolution
实现图形 ChallengeSolution
在给定项目和依赖项列表的情况下查找构建顺序 ChallengeSolution
在加权图中查找最短路径 ChallengeSolution
在未加权图中查找最短路径 ChallengeSolution
添加质询 ContributeContribute

排序

挑战 静电笔记本
实现选择排序 ChallengeSolution
实现插入排序 ChallengeSolution
实现快速排序 ChallengeSolution
实现合并排序 ChallengeSolution
实现基数排序 ChallengeSolution
对字符串数组进行排序,以便所有字谜都相邻 ChallengeSolution
在排序的旋转数组中查找项 ChallengeSolution
在排序矩阵中搜索项目 ChallengeSolution
在n个整数的输入中查找不是的整数 ChallengeSolution
给定排序数组A、B,按排序顺序将B合并到A中 ChallengeSolution
实现稳定选择排序 ContributeContribute
使不稳定排序稳定 ContributeContribute
实现高效的就地版本的快速排序 ContributeContribute
给定两个排序的数组,按排序顺序将一个合并到另一个 ContributeContribute
在经过旋转和排序的整数数组中查找元素 ContributeContribute
添加质询 ContributeContribute

递归与动态规划

挑战 静电笔记本
递归、动态和迭代地实现Fibonacci ChallengeSolution
最大化放置在背包中的物品 ChallengeSolution
最大化放置在背包中的无界项目 ChallengeSolution
查找最长的公共子序列 ChallengeSolution
找出最长的递增子序列 ChallengeSolution
最小化矩阵乘法的成本 ChallengeSolution
在给定k个交易的情况下最大化股票价格 ChallengeSolution
在给定一组硬币的情况下,找出表示n美分的最小方法数 ChallengeSolution
在给定一组硬币的情况下,找出表示n美分的唯一数量的方法 ChallengeSolution
打印n对括号的所有有效组合 ChallengeSolution
在迷宫中导航 ChallengeSolution
打印集合的所有子集 ChallengeSolution
打印字符串的所有排列 ChallengeSolution
在数组中查找魔术索引 ChallengeSolution
找出运行n个步骤的方式的数量 ChallengeSolution
用3个塔和N个圆盘实现河内之塔 ChallengeSolution
递归、动态和迭代地实现阶乘 ContributeContribute
对已排序的整数数组执行二进制搜索 ContributeContribute
打印字符串的所有组合 ContributeContribute
实现绘画填充功能 ContributeContribute
给出1、5、10、25美分硬币,找出代表n美分的所有排列 ContributeContribute
添加质询 ContributeContribute

数学与概率

挑战 静电笔记本
生成素数列表 ChallengeSolution
找到数字根 ChallengeSolution
在O(1)中创建支持插入、最大、最小、平均、模式的类 ChallengeSolution
确定一个数字是否为2的幂 ChallengeSolution
将不带+或-号的两个数字相加 ChallengeSolution
减去两个不带+或-号的数字 ChallengeSolution
检查数字是否为质数 ContributeContribute
确定笛卡尔平面上的两条直线是否相交 ContributeContribute
仅使用整数的加法、减法和除法实现乘法、减法和除法 ContributeContribute
找出第k个数,使其唯一的素因数为3、5和7 ContributeContribute
添加质询 ContributeContribute

位操作

挑战 静电笔记本
实现常见的位操作操作 ChallengeSolution
确定要翻转以将a转换为b的位数 ChallengeSolution
在屏幕上画一条线 ChallengeSolution
翻转一位以最大化最长的1序列 ChallengeSolution
获取下一个最大和下一个最小的数字 ChallengeSolution
合并两个二进制数 ChallengeSolution
交换整数中的奇数位和偶数位 ChallengeSolution
打印介于0和1之间的数字的二进制表示法 ChallengeSolution
确定给定整数的二进制表示中的1的个数 ContributeContribute
添加质询 ContributeContribute

网上评委

挑战 静电笔记本
查找最多包含k个不同字符的最长子字符串 ChallengeSolution
找出三个数字的最高乘积 ChallengeSolution
通过1次买入和1次卖出最大化股票利润 ChallengeSolution
将列表中的所有零移动到末尾 ChallengeSolution
找出所有其他整数的乘积 ChallengeSolution
给出进场和出场的列表,找出最繁忙的时段 ChallengeSolution
确定岛屿的周长 ChallengeSolution
格式化许可证密钥 ChallengeSolution
查找最长的绝对文件路径 ChallengeSolution
合并元组范围 ChallengeSolution
分配Cookie ChallengeSolution
确定您是否可以在NIM中获胜 ChallengeSolution
检查一本杂志是否可能被用来制作赎金字条 ChallengeSolution
找出一个句子可以在屏幕上显示的次数 ChallengeSolution
乌托邦之树 ChallengeSolution
最大化异或 ChallengeSolution
添加质询 ContributeContribute

回购结构

interactive-coding-challenges        # Repo
├─ arrays_strings                    # Category of challenges
│  ├─ rotation                       # Challenge folder
│  │  ├─ rotation_challenge.ipynb    # Challenge notebook
│  │  ├─ rotation_solution.ipynb     # Solution notebook
│  │  ├─ test_rotation.py            # Unit test*
│  ├─ compress
│  │  ├─ compress_challenge.ipynb
│  │  ├─ compress_solution.ipynb
│  │  ├─ test_compress.py
│  ├─ ...
├─ linked_lists
│  ├─ palindrome
│  │  └─ ...
│  ├─ ...
├─ ...

*笔记本(.ipynb)读/写关联的单元测试(.py)文件

笔记本安装

零安装

本自述包含指向以下内容的链接Binder,哪些主机动态笔记本不需要安装的在线回购内容

木星笔记本

运行:

pip install jupyter

有关更优化地设置开发环境的详细说明、脚本和工具,请参阅dev-setup回购

有关笔记本安装的更多详细信息,请按照说明操作here

有关IPython/Jupyter笔记本的更多信息,请访问here

跑步挑战

笔记本电脑

挑战以以下形式提供IPython/Jupyter笔记本电脑一直以来都是使用Python 2.7和Python 3.x进行测试

如果您需要安装IPython/Jupyter笔记本,请参阅Notebook Installation部分

  • 本自述包含指向以下内容的链接nbviewer,哪些主机静电笔记本回购的内容
  • 中的元素进行交互或修改动态笔记本,请参阅以下说明

运行挑战笔记本:

$ git clone https://github.com/donnemartin/interactive-coding-challenges.git
$ cd interactive-coding-challenges
$ jupyter notebook

这将启动包含质询类别列表的Web浏览器:

  • 导航到挑战笔记本你想要解决
  • 运行挑战笔记本中的单元格(单元格->全部运行)
    • 这将导致预期的单元测试错误
  • 解决挑战并验证它是否通过了单元测试
  • 查看随附的解决方案笔记本以供进一步讨论

调试您的PDB解决方案,请参阅以下内容ticket

注意:如果您的解决方案与解决方案笔记本中列出的解决方案不同,请考虑提交Pull请求,以便其他人可以从您的工作中受益。回顾Contributing Guidelines有关详细信息,请参阅

未来发展方向

挑战、解决方案和单元测试以IPython/Jupyter笔记本电脑

  • 笔记本目前主要包含Python解决方案(在Python2.7和Python3.x上都进行了测试),但可以进行扩展以包括40+ supported languages
  • 回购将是不断更新新的解决方案和挑战
  • Contributions欢迎光临!

贡献

欢迎投稿!

回顾Contributing Guidelines有关如何执行以下操作的详细信息,请执行以下操作:

  • 提交问题
  • 为现有挑战添加解决方案
  • 添加新的挑战

学分

资源

图像

联系信息

请随时与我联系,讨论任何问题、问题或评论

我的联系信息可以在我的GitHub page

许可证

我在开放源码许可下向您提供此存储库中的代码和资源。因为这是我的个人存储库,您获得的我的代码和资源的许可证来自我,而不是我的雇主(Facebook)

Copyright 2015 Donne Martin

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Rich-Rich是一个Python库,用于终端中的富文本和美观的格式设置

中文 readme·Lengua española readme·Deutsche readme·Läs på svenska·日本語 readme·한국어 readme

Rich是一个Python库,用于富有终端中的文本和美观的格式

这个Rich API使您可以轻松地向终端输出添加颜色和样式。Rich还可以呈现漂亮的表格、进度条、标记、语法突出显示的源代码、回溯等等–开箱即用

有关Rich的视频介绍,请参阅calmcode.io通过@fishnets88

看看什么people are saying about Rich

兼容性

Rich适用于Linux、OSX和Windows。真彩色/表情符号适用于新的Windows终端,经典终端仅限16色。Rich需要Python 3.6.1或更高版本

Rich与Jupyter notebooks无需额外配置

正在安装

随一起安装pip或您最喜欢的PyPI包管理器

pip install rich

运行以下命令在您的终端上测试Rich Output:

python -m rich

丰富多彩的印刷品

若要毫不费力地向应用程序添加丰富的输出,可以将rich print方法,该方法与内置Python函数具有相同的签名。试试这个:

from rich import print

print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())

丰富的REPL

Rich可以安装在Python REPL中,这样任何数据结构都会非常漂亮地打印和突出显示

>>> from rich import pretty
>>> pretty.install()

使用控制台

要更好地控制富终端内容,请导入并构造Console对象

from rich.console import Console

console = Console()

Console对象有一个print方法,该方法的接口有意与构建的print功能。下面是一个使用示例:

console.print("Hello", "World!")

如您所料,这将打印出来"Hello World!"去航站楼。请注意,与建筑不同的是print函数时,Rich将对文本进行自动换行以适应终端宽度

有几种方法可以将颜色和样式添加到输出中。您可以为整个输出设置样式,方法是将style关键字参数。下面是一个示例:

console.print("Hello", "World!", style="bold red")

输出将如下所示:

对于一次设置一行文本的样式来说,这是很好的。对于更细粒度的样式,Rich呈现了一个特殊的标记,该标记在语法上类似于bbcode下面是一个示例:

console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")

您可以使用Console对象以最小的工作量生成复杂的输出。请参阅Console API详细信息请参阅文档

丰富考察

里奇有一个inspect可以生成有关任何Python对象(如类、实例或构建)的报告的函数

>>> my_list = ["foo", "bar"]
>>> from rich import inspect
>>> inspect(my_list, methods=True)

请参阅inspect docs有关详细信息,请参阅

丰富的图书馆

RICH包含多个建筑可渲染对象您可以使用在CLI中创建优雅的输出,并帮助您调试代码

有关详细信息,请单击以下标题:

日志

Console对象有一个log()方法,该方法具有类似于print(),而且还呈现当前时间的列以及进行调用的文件和行。默认情况下,Rich将对Python结构和REPR字符串进行语法高亮显示。如果您记录一个集合(例如,词典或列表),Rich会漂亮地打印它,以便它可以放在可用的空间中。以下是其中一些功能的示例

from rich.console import Console
console = Console()

test_data = [
    {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
    {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
]

def test_log():
    enabled = False
    context = {
        "foo": "bar",
    }
    movies = ["Deadpool", "Rise of the Skywalker"]
    console.log("Hello from", console, "!")
    console.log(test_data, log_locals=True)


test_log()

以上将产生以下输出:

请注意log_locals参数,该参数输出一个包含调用log方法的局部变量的表

LOG方法可用于登录到终端,用于长时间运行的应用程序(如服务器),但也是非常好的调试辅助工具

日志记录处理程序

您还可以使用内置的Handler class对来自Python日志记录模块的输出进行格式化和着色。以下是输出的示例:

表情符号

要在控制台输出中插入表情符号,请将名称放在两个冒号之间。下面是一个示例:

>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
😃 🧛 💩 👍 🦝

请明智地使用此功能

表格

丰富的可以灵活地呈现tables使用Unicode方框字符。边框、样式、单元格对齐等有多种格式选项

上面的动画是用table_movie.py在Examples目录中

下面是一个更简单的表格示例:

from rich.console import Console
from rich.table import Table

console = Console()

table = Table(show_header=True, header_style="bold magenta")
table.add_column("Date", style="dim", width=12)
table.add_column("Title")
table.add_column("Production Budget", justify="right")
table.add_column("Box Office", justify="right")
table.add_row(
    "Dev 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118"
)
table.add_row(
    "May 25, 2018",
    "[red]Solo[/red]: A Star Wars Story",
    "$275,000,000",
    "$393,151,347",
)
table.add_row(
    "Dec 15, 2017",
    "Star Wars Ep. VIII: The Last Jedi",
    "$262,000,000",
    "[bold]$1,332,539,889[/bold]",
)

console.print(table)

这将产生以下输出:

请注意,控制台标记的呈现方式与print()log()事实上,Rich可以呈现的任何内容都可能包含在标题/行中(甚至其他表)

这个Table类足够智能,可以调整列的大小以适应终端的可用宽度,并根据需要对文本进行换行。下面是相同的示例,端子比上表小:

进度条

丰富的可以呈现多个无闪烁progress用于跟踪长期运行任务的条形图

对于基本用法,将任何序列包装在track函数并迭代结果。下面是一个示例:

from rich.progress import track

for step in track(range(100)):
    do_step(step)

添加多个进度条并不难。以下是文档中的一个示例:

这些列可以配置为显示您想要的任何详细信息。内置列包括完成百分比、文件大小、文件速度和剩余时间。下面是另一个示例,显示正在进行的下载:

要亲自尝试此功能,请参见examples/downloader.py它可以在显示进度的同时同时下载多个URL

状态

对于很难计算进度的情况,可以使用status方法,该方法将显示“微调器”动画和消息。动画不会阻止您正常使用控制台。下面是一个示例:

from time import sleep
from rich.console import Console

console = Console()
tasks = [f"task {n}" for n in range(1, 11)]

with console.status("[bold green]Working on tasks...") as status:
    while tasks:
        task = tasks.pop(0)
        sleep(1)
        console.log(f"{task} complete")

这将在终端中生成以下输出

微调器动画借用自cli-spinners您可以通过指定spinner参数。运行以下命令以查看可用值:

python -m rich.spinner

上面的命令在终端中生成以下输出:

Rich可以呈现一个tree带着指引线。树是显示文件结构或任何其他分层数据的理想选择

树的标签可以是简单的文本,也可以是Rich可以呈现的任何其他内容。运行以下命令进行演示:

python -m rich.tree

这将生成以下输出:

请参阅tree.py显示任何目录的树视图的脚本示例,类似于Linuxtree命令

Rich可以整齐地呈现内容columns具有相等或最佳宽度的。下面是(MacOS/Linux)的一个非常基本的克隆ls按列显示目录列表的命令:

import os
import sys

from rich import print
from rich.columns import Columns

directory = os.listdir(sys.argv[1])
print(Columns(directory))

下面的屏幕截图是columns example它以列的形式显示从API拉取的数据:

降价

Rich可以渲染markdown并且合理地将格式转换到终端

若要呈现标记,请将Markdown类,并使用包含标记代码的字符串构造它。然后将其打印到控制台。下面是一个示例:

from rich.console import Console
from rich.markdown import Markdown

console = Console()
with open("README.md") as readme:
    markdown = Markdown(readme.read())
console.print(markdown)

这将产生类似以下内容的输出:

语法突出显示

Rich使用pygments要实施的库syntax highlighting用法类似于呈现标记;构造Syntax对象,并将其打印到控制台。下面是一个示例:

from rich.console import Console
from rich.syntax import Syntax

my_code = '''
def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:
    """Iterate and generate a tuple with a flag for first and last value."""
    iter_values = iter(values)
    try:
        previous_value = next(iter_values)
    except StopIteration:
        return
    first = True
    for value in iter_values:
        yield first, False, previous_value
        first = False
        previous_value = value
    yield first, True, previous_value
'''
syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
console = Console()
console.print(syntax)

这将产生以下输出:

跟踪回溯

Rich可以渲染beautiful tracebacks它们比标准Python回溯更容易阅读和显示更多代码。您可以将Rich设置为默认的回溯处理程序,这样所有未捕获的异常都将由Rich呈现

下面是它在OSX上的样子(与Linux类似):

所有丰富渲染器都使用Console Protocol,您还可以使用它来实现您自己的富内容

为企业发财致富

作为Tidelift订阅的一部分提供

Rich和数千个其他软件包的维护者正在与Tidelift合作,为您用来构建应用程序的开源软件包提供商业支持和维护。节省时间、降低风险并提高代码的健全性,同时付钱给您所使用的包的维护者。Learn more.

使用Rich的项目

以下是一些使用Rich的项目: