Python

实时日志输出:解决Docker容器中Python日志延迟的简易方法!

在Docker容器中部署Python应用程序时,你可能会遇到一个令人困扰的问题:日志输出有延迟,导致日志信息不是实时显示的。这种情况下,你无法立即查看应用程序的运行状态,也不方便调试问题。然而,幸运的是,我们有一个简单的方法可以解决这个问题。 问题原因: 默认情况下,Python的标准输出和标准错误输出会被缓冲,而不是实时输出到终端或日志文件中。这就导致了在Docker容器中运行Python应用程序时,日志信息会积累一段时间后才一次性输出,造成延迟显示的现象。 解决方法: 要解决这个问题,我们只需在运行Python脚本时,在Python解释器命令中加入-u选项即可。这个选项的作用是取消缓冲,使得日志信息能够实时输出,而不需要等待缓冲区填满或应用程序结束。 使用示例: 假设我们有一个名为app.py的Python脚本,内容如下: 在Docker容器中运行这个脚本时,我们可以这样做: 解释: 在上述命令中,我们使用了Python 3的官方镜像,并在容器中运行了app.py脚本。通过加入-u选项,我们解决了日志延迟显示的问题,现在日志信息将会实时显示在终端中。 结语: 通过在运行Python脚本时加入-u选项,我们能够简单高效地解决Docker容器中Python日志延迟显示的问题。这个小技巧让我们更轻松地监控和调试Python应用程序,提高了开发和运维的便利性。希望这个方法对你在Docker容器中部署Python应用程序时有所帮助!

Node js 里有没有像selenium类似的framework?

在Node.js中,有一个类似于Selenium的自动化测试框架叫做Puppeteer。Puppeteer是一个由Google开发的Node.js库,提供了一个API来控制和操作浏览器。它可以用于模拟用户行为、进行页面导航、执行JavaScript、提取数据等等。 Puppeteer具有以下特点: 可以通过无头模式运行,即在没有界面的情况下运行浏览器操作。 可以与Chrome浏览器无缝集成。 支持对页面进行截图和PDF生成。 允许模拟键盘和鼠标输入。 可以进行页面自动化测试和爬虫等任务。 你可以使用Puppeteer来实现类似于Selenium的自动化测试和浏览器操作。它提供了丰富的API,使得控制和操作浏览器变得非常方便。你可以使用Puppeteer来加载网页、填写表单、点击按钮、抓取数据等等操作。 要开始使用Puppeteer,你需要先安装它。可以使用npm(Node.js的包管理器)来安装Puppeteer。在命令行中运行以下命令: 安装完成后,你可以在Node.js脚本中引入Puppeteer并开始使用它。以下是一个简单的示例,展示了如何使用Puppeteer来打开网页并截取页面截图: 这段代码会启动一个无头Chrome浏览器实例,创建一个新的页面,然后导航到指定的网址,并最后保存页面截图为example.png。 这只是Puppeteer的一个简单示例,它还有很多功能和API可以探索。你可以查阅Puppeteer的官方文档来了解更多信息和示例:https://pptr.dev/

用python给文件生成bloom filter

bloom filter是什么? Bloom filter(布隆过滤器)是一种概率型数据结构,用于判断一个元素是否属于一个集合,具有高效的插入和查询操作。它可以快速告诉你某个元素“可能存在”或“一定不存在”于一个集合中,但无法确定元素的确切存在与否。 Bloom filter 由布隆提出并在1970年发表,它基于哈希函数的应用。它的核心是一个位数组(bit array)和一组哈希函数。位数组用于表示集合,初始时所有的位都被置为0。哈希函数用于将元素映射为位数组的索引,并将对应位置的位设置为1。 插入元素时,通过对元素应用一组哈希函数,可以得到多个位数组索引,然后将这些索引对应的位设置为1。查询元素时,同样对元素应用哈希函数,得到相应的位数组索引,如果所有的索引位置的位都为1,则说明元素“可能存在”于集合中;如果任何一个索引位置的位为0,则可以确定元素“一定不存在”于集合中。 由于使用了多个哈希函数和位数组,Bloom filter 具有较低的内存占用和快速的查询速度。然而,它也存在一定的误判率(false positive),即在判断元素存在时可能会出现错误判断。这是因为不同元素的哈希函数映射到位数组时可能产生冲突,导致位数组的某些位置同时被设置为1,从而影响判断结果。 Bloom filter 主要应用于那些对查询速度要求较高、可以容忍一定的误判率的场景,例如网络缓存、大规模数据集的去重、垃圾邮件过滤等。通过适当调整位数组大小和哈希函数的数量,可以在一定程度上控制误判率和内存占用。 bloom filter 和 hash function有什么不同? Bloom filter(布隆过滤器)和哈希函数在使用方式和目的上有一些不同之处: 目的:Bloom filter 的主要目的是判断一个元素是否属于一个集合,它提供了一种快速的判断方式,可以告诉你元素“可能存在”或“一定不存在”于集合中。而哈希函数的主要目的是将数据映射为较短的固定长度值,常用于加密、数据唯一性校验、散列查找等方面。 数据结构:Bloom filter 是一种概率型数据结构,它由一个位数组(bit array)和一组哈希函数组成。位数组用于表示集合,哈希函数用于将元素映射到位数组的索引。哈希函数通常是不可逆的,将输入映射到固定长度的输出。而哈希函数本身并不包含数据结构,它只是一个单独的函数。 功能:Bloom filter 用于判断元素是否属于一个集合,具有高效的插入和查询操作。它可以给出“可能存在”或“一定不存在”的答案,但无法确定元素的确切存在与否。哈希函数则是将数据进行转换和计算,通常用于唯一标识、散列查找、数据完整性校验等。 冲突和误判:Bloom filter 可能存在哈希冲突,即不同元素经过哈希函数计算后映射到相同的位数组位置,这可能导致误判。而哈希函数应该尽量避免冲突,以确保在不同的输入上产生不同的输出,但在实际应用中,哈希冲突是难以完全避免的。 总的来说,Bloom filter 是基于哈希函数的一种数据结构,它利用哈希函数将元素映射到位数组,并通过多次哈希映射来提供快速的元素判断。哈希函数则是独立的计算函数,用于将数据映射为固定长度的值,常用于唯一标识、散列查找、数据完整性校验等场景。 用Python给文件生成bloom…
Read more

怎样计算cosine similarity? Python实例

1 使用Tensorflow / Keras Keras提供的loss function有cosine similarity 输出结果 需要注意的是,Keras算出来的结果是负的。因为它是作为一种loss function,如果2个向量越相似,他们越接近1,所以loss越小,那么Keras就把一般意义上的Consine similarity加了个负号。 2 只使用Raw Python 只用Raw Python写个函数也不难,代码如下 输出结果 这样就没有负数问题了。

旧金山湾区时间与北京时间转换,用python实现时区转换例子

San Francisco Time ?? Beijing Time ?? 把一个时区的时间,比如湾区9:00am,转换成另一个时区的时间,比如北京/香港/新加坡时间,应该是很简单的问题。用Python做时区转换好像挺麻烦的,容易出错。Google出来的前几条结果都不是很让人满意,本文总结我测试过可靠可行不太复杂的方法,以及一些容易出错的地方。 先上可行的Python例子,把三藩(SF)湾区时间9am, 转换成对应的北京时间,用了datetime和pytz。先构造一个湾区时间的对象,然后转化成北京/香港/新加坡时间。 加上注解和debug信息。 可以看到建立的湾区时间时区为-0700而北京时间为0800,可以验证湾区和中国时差为15小时。 时区行话解释 全球标准时间用的是位于英国的格林威治时间(GMT, Greenwich Mean Time)。因为以前格林威治天文台是世界中心,本初子午线或者0度经线就定义为穿过它的经线。然后又有了一个叫世界协调时间的东西(UTC, Coordinated Universal Time)。这个和GMT基本一致,大概就是北京话和普通话的区别吧。北京在Greenwich的东边,时间领先GMT/UTC 8小时,所以叫东八区,代号0800。而湾区在格林威治的西边,时间滞后7个小时(美国国会通过了永久使用夏令时法案),所以叫西7区,代号-0700。而两地时差为7+9=15,北京时间比湾区时间领先15个小时。 同理,日本和韩国位于东9区,代号为0900,那么时间就比为与东八区的中国早1小时。 当地真实时间和约定标准时间 一个地方的真实时间只取决于太阳相对当地的位置,也就是取决于当地经度。但是为了方便,每个国家可以人为规定用什么时间。比如整个中国虽然跨了几个纬度,确人为规定了各地都使用北京时间。新加坡真实时间应该为0655,确规定使用0800,也许是和大中华区保持一致比较方便。 回到Python上,这也正是pytz包的一些坑的来源。pytz用的是地理意义上的真实时间,而人们真正使用的是当地法律约定的时间,这两者是有差别的。 Python datetime不设时区是什么时间? 如果新建一个datetime对象,不设时区的话,会是当地时间。 用epochconverter转换1656658800.0,正是湾区时间2022-07-01 00:00:00 如果replace了timezone,就把底下的timestamp变了,而不是保持timestamp而改变时间表示形式(日期,小时/分/秒)。所以replace(tzinfo=…)并不是做时区变换。而且注意下面例子里上海时间是0806,并不是0800,应该用了地理意义上的真实时间而不是法定时间。这个地理时间在生活中基本没用,这个pytz的坑之一。 参考 Python3中datetime时区转换介绍与踩坑 python datetime时区转换 技巧:用datetime模块处理时区转换,不要用time模块 将UTC、EST时区的时间转化成北京时间(python) pytz库时区的坑(转) The Solution…
Read more

Python Pathlib生存手册,几个短例子极速上手

Pathlib是Python里自带的处理OS路径的library,功能非常强大,可以代替原来的os.path。本文提供几个简单的例子供查询,帮您极速上手,引用到自己的python project里。 创建操作Path对象例子 可以用”/“直接得到下一层目录或文件的Path对象 Home Path对象例子 需要注意的是,Path constructor的参数不认识~。需要用Path.home()。 验证tilda不work 验证Path.home() work 当前目录例子 如果需要当前目录的对象可以用cwd函数或者.加resolve函数 遍历文件夹例子 也就是implement bash命令 用pathlib实现如下 外面函数python_find接受path string,里面的递归函数_python_find接受pathlib.Path object。用iterdir列出当前input path下的所有对象,先打印它们的路径,如果是目录,就继续调用递归函数_python_find打印下一层目录里面的内容。 Pathlib删除文件例子 删除文件 删除目录/文件夹 rmdir只能删除空的文件夹/目录,如果内部还有其他文件或目录会报错。 删除非空目录/文件夹 这个只能自己用上面两个函数用递归实现。这里我增加了显示被删除文件size的信息。 参考 一分钟学一个 Python 标准库之 Pathlib PathLib recursively remove directory? pathlib — Object-oriented filesystem paths…
Read more

安装IBKR python API

到IB官网下载最新API,选Software: TWS API,然后”I Agree” License aggreement。然后选平台,比如TWS API Latest for Mac / Unix。 cd 到下载地址。 根据README.md里说的 具体版本可能有点不一样。我安装的时候README.md里的版本有点过时,不是下载的现有版本。 安装完成后就可以读User’s Guide了。