macOS Catalina + Python3.7 安装 GPT-2

等 GPT-3 出正式版之前,先拿 GPT-2 玩耍。记录在 macOS Catalina 上安装 GPT-2 的过程。

  • pip3 install tensorflow==1.15
  • git clone https://github.com/openai/gpt-2.git
  • 进入 gpt-2 文件夹,pip3 install -r requirements.txt
  • python3 download_model.py 1558M(其它体量参数自小到大:124M、355M、774M)
  • 我用的是 Python3.7,运行报错「dictionary changed size during iteration」。这时候需要凭 sudo 身份,将错误日志里那个 linecache.py 的 48 行改成:「for mod in list(sys.modules.values()):」
  • 测试运行吧!python3 src/interactive_conditional_samples.py –top_k 40

快速将 Mac 自带 Python 版本环境从 2.X 修改到 3.7

拿出一台闲置的 MacBook Air 作为个人项目的生产环境服务器。这台 2015 年的古董,自带 Python 2.7,在额外安装上 Python 3.7 后,产生紊乱,例如:pip3 install 的目标路径仍然指向 Python 2.7 的路径。

找了一圈,试过之后最省事的方法是:virtualenv:

1、在 Mac 上安装 virtualenv:sudo pip install virtualenv

2、找到 python3的路径:which python3,发现藏在 /usr/bin/python3 下。

3、执行 virtualenv 命令,修改 pip 的安装路径到 python3上:

  • sudo virtualenv -p /usr/bin/python3 py3env
  • source py3env/bin/activate

4、环境修改之后,查看变量修改是否成功:pip3 -V,看到结果: 后面出现了 python3 的路径,说明修改成功。

5、正常用 pip3 安装 python3 包即可。

基于 Python + 第三方自动化工具,为 Instapaper 开发一键翻译功能

我将 Inoreader 作为日常信息过滤的管道,经其筛选后的待读文章流到 Instapaper。

因有阅读国外文献的需求,考察下来认为现有的解决方案(iOS 系统捷径 / 翻译类 APP / 通过 Chromium 内核浏览器打开用彩云小译插件等 ),既不方便,也不原生,更不灵活。所以决定自己简单定制开发。

一个晚上实现。工具准备:Python + IFTTT + Google Drive。

以下是思路:

1、在 Instapaper 专门新建文件夹「To Translate」。

2、日常阅读时,将想翻译的英文文章,随手移到「To Translate」。

3、在 IFTTT 设置一个新的 Applet:IF 我的 Instapaper 的「To Translate」文件夹下新增文章,THEN 将这篇文章上传到我的 Google Drive 的指定文件夹「Translate Slave/」下。

4、这个 Google Drive 的 「Translate Slave/」文件夹同步到 Mac 本地。

5、Mac 本地跑一个 Python 脚本,不断轮询上述「Translate Slave/」文件夹,一旦发现新增的文章(会是 html 格式的网页),则开始执行我的整套翻译动作,如:

  • 基于 goose3 获取这个网页的正文内容
  • 基于 deepL 完成翻译
  • 其它任何我想实现的效果,例如对照翻译、生成摘要、生成 Tags 等

6、 将上述翻译结果,通过 Python 发送电子邮件到我的 Instapaper 邮箱(一个 小众 feature,收到符合格式的邮件,会自动添加到 Instapaper 待读列表)。

于是,当我在浏览待读列表时,只需要将想翻译的文章,丢到「To Translate」,稍待一会儿,它的翻译版,就将出现在待读列表的顶部了。

配合 Instapaper 的中文朗读功能,简直不要太赞。

Mac 下使用 Python + Selenium 的几则避坑经验

最近研究 Mac 下运用 Python + Selenium,记录遭遇的几例经典避坑。

问题一:想自动控制的浏览器是 Safari,但问题是:Safari (版本号 13.1)默认仅会启动 Incognito(Private) Browsing 的独立新窗口(隐身模式),也就是不带任何浏览器的 cookies、缓存等用户预设信息,这极不方便伪造既有身份完成(诸如抓取仅限会员查看的资料等)动作。怎么办?

解法:从官方到民间搜了一圈,Safari 没有其他设置方法(可能是苹果出于安全考量)或 hack 野路子,只能作罢。换用 Google Chrome,因其体态轻盈、设置丰富。(搁到我另一台服务器 Ubuntu 桌面版下自然就是 Chromium)

问题二:我的 Google Chrome 自动升级到了 V85,但是 Mac + Python + Selenium 必备的文件 ChromeDriver(WebDriver for Chrome,https://sites.google.com/a/chromium.org/chromedriver/downloads)最新只支持到 V84,怎么办?

解法:无他,卸载 Chrome V85,重装回随手找到的旧版 V81,于是原本报错的代码果然跑起来了。额外提示,这里千万记得将 Chrome 设置成「不要自动升级」,以免夜长梦多,方法是:关闭 Chrome,进入目录 /Library/Google/GoogleSoftwareUpdate ,删除该目录下的 GoogleSoftwareUpdate.bundle 即可。

问题三: Chrome 自动执行开始,默认依然是打开类似隐身模式的独立窗口,我想要自动带上当前浏览器用户的身份信息,怎么做?

解法:

# 需要先命令行下 pip install webdriver_manager.chrome
from webdriver_manager.chrome import ChromeDriverManager_
from selenium.webdriver.chrome.webdriver import Options
opts = webdriver.ChromeOptions()
user_profile = '/Users/YourName/Library/Application Support/Google/Chrome'
opts.add_argument('user-data-dir=' + user_profile)
dr = webdriver.Chrome(ChromeDriverManager().install(),options=opts)
dr.get(url)

#上述 user_profile 变量是你的个人资料路径,可以在 Chrome 地址栏输入「chrome://version/」查看到。

2020/06/16 Update:上述问题三中一开始错加了的 Default 已经去掉(即原写「/Users/YourName/Library/Application Support/Google/Chrome/Default」,应该仅「/Users/YourName/Library/Application Support/Google/Chrome」。)

Python + Dropbox 打造简易版 WebCam

最近一阵离职在家休息,终于有相对充裕的时间折腾研究一些感兴趣的东西,比如 Arduino,比如 Python,比如 HTML5,又比如我还领养了一只小仓鼠。

晚上折腾时发现了 VideoCapture 这个 Python 库,用于获取对视频设备的支持,能通过电脑摄像头捕获视频信号以及截图。联想到平时出门需要了解一下家中仓鼠的动态,于是灵机一动,打算巧借 Dropbox 的力量打造一个 Python 实现的 WebCam。

原理:利用 Python 调用 VideoCapture 获取摄像头拍到的图像,保存到 Dropbox 的 Public 文件夹下,通过 Dropbox 的自动同步更新这个外链的图片文件,从而实现远程监控的 WebCam 功能。

Continue reading “Python + Dropbox 打造简易版 WebCam”