小问题大隐患:如何正确设置 Python 项目的入口文件?
今天在公众号粉丝群里面,有一位同学提到了 Python 找不到模块的问题:
问题涉及到的代码结构和代码截图如下:
这个问题的解决方法非常简单,就是把start.py
文件从bin
文件夹移出来就好了。
但如果对这个问题进一步分析,可以看到更多问题。
今天在公众号粉丝群里面,有一位同学提到了 Python 找不到模块的问题:
问题涉及到的代码结构和代码截图如下:
这个问题的解决方法非常简单,就是把start.py
文件从bin
文件夹移出来就好了。
但如果对这个问题进一步分析,可以看到更多问题。
经常使用 Selenium 或者 Puppeteer 的同学都知道,他们启动的 Chrome 浏览器分为有头模式和无头模式。在自己电脑上操作时,如果是有头模式,会弹出一个 Chrome 浏览器窗口,然后你能看到这个浏览器里面在自动操作。而无头模式则不会弹出任何窗口,只有进程。
别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征这篇文章中,我们介绍了一个探测模拟浏览器特征的网站。通过他我们可以发现,在不做任何设置的情况下,Selenium 或者 Puppeteer 启动的浏览器有几十个特征能够被目标网站识别为爬虫。并且,无头模式的特征比有头模式的特征多得多。
使用 macOS 的同学,应该熟悉一个命令pbcopy
,它可以在命令行中把一段内容写入到剪贴板,例如:
1 | echo "kingname" | pbcopy |
就能把字符串kingname
复制到剪贴板里面。我们也可以使用这个方法把一个文件中的内容写入到剪贴板:
1 | cat xxx.txt | pbcopy |
这样我们就不需要把文件打开再手动复制的。
有时候,我要把服务器上面的日志复制下来。原来都是进入服务器以后,用 vim 打开日志文件,用鼠标选中再复制。且不说服务器是 Linux,没有pbcopy
这个命令,即使有这个命令,服务器上又怎么能访问本地的剪贴板呢?
Git 是现在使用最广泛的源代码管理程序。一个合格的程序员必须要熟练掌握 Git。在使用 Git 的时候,最让人头疼的问题是什么?肯定是解冲突了。如果两个人修改了同一个文件的相同位置,那么当一个人提交代码并合并到主分支以后,第二个人尝试合并时就会触发冲突。大多数情况下,Git 自己知道如何把两份代码合并起来。但有时候当 Git 不知道应该怎么合并,就会提示你需要手动解决冲突。
我以前学习 Git 的时候,由于没有人跟我一起提交代码,所以我为了模拟两人提交的情况,会把代码 clone 到两个文件夹里面,然后把相同的位置分别做不同的修改,再分别提交。过程非常繁琐。
我们知道,Selenium里面,当我们获得一个 element 对象的时候,如果它是一个输入框,那么我们可以使用.send_keys()
方法,模拟键盘按键,发送特定的字符串到输入框中,例如:
1 | input_box = driver.find_element_by_xpath('//input[@class="xxx"]') |
在一日一技:实现函数调用结果的 LRU 缓存一文中,我们提到Python自带的LRU缓存lru_cache
。通过这个装饰器可以非常轻松地实现缓存。
在写 Python 代码的时候,大家可能会在不知不觉中使用一些设计范式。我们来看两个例子。
现在我有10亿条微博正文,并从同事手上拿到了15000条需要过滤的垃圾信息正则表达式,只要微博正文符合任何一条正则表达式,就删除这条微博。
Python 初学者在阅读一些 Python 开源项目时,常常会看到一个叫做__init__.py
的文件。下图为著名的第三方库requests
的源代码:
那么__init__.py
有什么用呢?本文介绍它的两个用途。