前言:
讲道理开发Python项目本应该在linux环境下进行, 但本人对windows情有独钟, 所以主要使用windows进行开发. 但项目一般又得运行在ubuntu之类的Linux服务器下, 难免会遇到一些问题, 例如windows的环境下multiprocessing.JoinableQueue 无法阻塞主进程, docker服务还需要windows专业版才能完美跑起来, 再就是无法调用linux内核执行corntab定时任务之类的问题…虽然最好的解决方案是安装一个ubuntu虚拟机进行开发, 或者直接换一台mac电脑, 但本人本着能折腾就绝不放弃的态度寻求各种解决方案.
WSL是我解决这些问题的最大助力, 而且运行和开启速度都要比虚拟机快, 如果WSL能够支持docker守护进程那就更加开心了…

配置环境:

windows下使用pycharm专业版, 使用pycharm的Remote Python Interpreter功能调用WSL上的解释器, 再配合Deployment实现代码同步, 这么做的目的是在windows下编辑代码, 调试, 调用的却是linux环境, 所以需要Linux内核支持的功能也可以顺利使用了.
如果你打算直接在WSL上运行已经写好的代码, 看一下WSL怎么调用windows上的chromedriver和chrome浏览器, 那么配置pycharm的方法就可以直接跳过了, 直接进入下面的骚操作.
配置方法: https://blog.csdn.net/pipisorry/article/details/52269952
需要注意的是, WSL与windows共享ip和端口, 所以WSL的ssh端口需要更改一下, vim /etc/ssh/sshd_config ,将Port修改为你想要的端口, 我修改为了23, 退出wsl后重新打开WSL, sudo service ssh start, 前提是你安装了ssh, 在Pycharm中配置端口也要换成你改的那个, 另外我用的IP是127.0.0.1, 避免了因为局域网ip变更需要重复配置的问题. 说明一下为什么要修改端口号, 因为windows上的ssh用的是22端口, WSL上也是, 所以会冲突.
配置好以后的图: 注意 Path mappings, 如果执行代码告诉你no such dir…., 那就是你的mapping没设置好, 解释器和SFTP的mapping 都要设置对. 另外运行代码前请确认代码已经同步, 因为运行的代码其实是WSL上的代码, 可以将代码设置为自动同步或者保存时同步.
远程解释器

SFTP, 代码同步
映射目录配置

骚操作:
正题开始了, 我很佩服我的脑洞, 竟然会想到这种操作…
首先, 下载好windows下的chromedriver.exe文件, 放在windows下Python解释器安装目录的scripts文件里, 下载地址:

https://npm.taobao.org/mirrors/chromedriver  下载最新版

下载版本

下载最新的chrome浏览器, 我的是64位的
chrome版本

下面开始查看效果, 先确认一下两个软件可用, 测试代码:

from selenium import webdriver
#
driver = webdriver.Chrome(executable_path="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/Scripts/chromedriver.exe")
driver.save_screenshot("changcheng.png")
driver.get("http://www.baidu.com")

print(driver.page_source)
driver.quit()

选择 windows下的python解释器, 运行以上代码, 看下浏览器是否成功被调用, 是否打印结果, 是否正常退出,
正常情况下应该是一切OK的.

如果使用Pycharm的remote功能, 将解释器更换为WSL上的解释器, 请确认代码是否成功运行, 确保配置正常才能继续.
如果直接在WSL命令行启动程序, 直接继续.

执行代码:

from selenium import webdriver
driver = webdriver.Chrome(executable_path="/mnt/c/Program Files (x86)/Microsoft Visual   Studio/Shared/Python36_64/Scripts/chromedriver.exe")    # mnt目录为文件共享目录, 子系统可以访问到windows文件
driver.save_screenshot("changcheng.png")
driver.get("http://www.baidu.com")

print(driver.page_source)
driver.quit()

讲道理应该chrome被成功调用, 并且一切正常.
最糟糕的情况应该是chrome被调用但是却没了后文, 也不退出, 那么请手动退出, 请看下你的任务管理器, 是否有名为chromedriver的进程, 请关闭, 然后查看你的WSL, 是否正常, 是否有报错信息, 如果有, 请退出WSL. 再次执行代码. 我的到此就一直正常了.

结语:
因为并未深入使用, 所以不知道是否会有不可预知的问题, 请自行判断, 欢迎留言一起讨论.
虽然骚操作成功了, 但却有一个疑惑, 代码的运行环境是WSL->Linux, 那么chromedriver.exe是在windows上执行的还是linux上执行的, 如果是windows, 那么为何代码却是在linux上执行的, 如果exe是在Linux上执行的, 那么linux上真的可以跑windows上编译的exe吗,
就算真的是这样, chromedriver又是怎么做到调用windows下的chrome浏览器的…..这样看来在windows下运行的可能性更大, 但是却又不符合代码运行时的环境, 请大佬们指点!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐