前情请翻历史记录找这之前的两篇:‘卡住了’和‘中文字符变量拷到剪切板后粘贴出来’。
剧情发展到我以为找到了方向,美滋滋滴拿出来晒。
当时以为用以下代码可以把中文送到剪切板,然后再原封不动滴粘贴出来:
from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('两两相忘')
r.update()
r.destroy()
万万没想到这是个大坑,一脚踩下去‘轰’滴就倒栽葱到坑底。
逼得我到stackoverflow上去问:TK的剪切板和系统剪切板是不是不同步啊?
这个问题还没解决,又发现把代码放到搭好框架的自动填表程序后,每次运行到控制粘贴组合键试图把中文填入时,窗口都会“冻住”,这种自动控制最怕节奏不一致,这边一错后面跟着全乱套.......
“左冲右杀”好几天后决定放弃这个解决思路。
决定退回到subprocess的解法,认真研究
proc1 = subprocess.Popen(['echo', '陆小凤'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['pbcopy'], stdin=proc1.stdout)
这两条代码的前世今生(我用的是mac)。
1、捏着鼻子&耐着性子对照subprocess技术文档查着看,觉得应该先看
p1=subprocess.Popen(['echo','午夜星河‘], stdout=subprocess.PIPE
的subprocess.PIPE管道里的东西长什么样。
2、通过print(p1.communicate()[0])查看,发现是一堆看不懂的代码
3、通过print(chardet.detect(output1)) (需要引入chardet模块),得知代码是utf-8编码
4、print('午夜星河'.encode('utf-8'))出来的代码跟上面那堆看不懂的代码一摸一样,更确信subprocess.PIPE管道里是‘午夜星河’的utf-8编码
5、这些编码如果utf-8解码的话应该输出‘午夜星河’本身啊!print(output1.decode('utf-8'))可以验证这一点
6、所以问题出在解码这一步。p2=subprocess.Popen(['pbcopy'],stdin=p1.stdout),进来的是‘午夜星河’的utf-8编码,通过pbcopy命令存入到剪切板,但解码输出时乱码,说明解码没有用utf-8解码
搜索引擎上开始搜pbcopy的encoding和decoding, 数次尝试之后找到症结所在(https://stackoverflow.com/questions/7165108/in-os-x-lion-lang-is-not-set-to-utf-8-how-to-fix-it):
在terminal敲入命令:locale,我的输出类似于:
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
不清楚哪一个影响IOEncoding的编码,但是可以全排山倒海排成UTF-8编码,‘宁可错杀一千,也不错过一个’,
反正现在UTF-8几乎一统江湖啦。
打开finder去用户的根目录下找文件.bash_profile,什么?找不到,没看到文件名前面有个点么?!那就是为了让你看不见的(隐藏文件属性)。照妖镜(快捷键command+shift+.)一照,管叫那隐藏文件无处遁形。
打开在文件末尾加入(最好给个注释,你看别的命令前都有注释解释下,好东西咱得跟着学):
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
再回敲locale,输出变成:
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
再回头试:
proc1 = subprocess.Popen(['echo', '云开见月'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['pbcopy'], stdin=proc1.stdout)
漂亮的中文字映入眼帘,“春天里来百花香郎里格朗里格朗里格朗,和暖的太阳在天空照照到了我的破衣裳”
又经过了一些调试测试,终于可以吧这段代码引入到自动填写表格的代码中了,非常流畅的完成自动把中文填入文本框的任务。
在录制视频时,突发奇想,想试试最初被果断抛弃的两个办法:
import pyperclip
pyperclip.copy('浮世繁华')
然后粘贴,‘浮世繁华’四个字跃然屏上
import clipboard
clipboard.copy('天龙八部')
‘天龙八部’四个字也完美呈现
心情复杂,绕了一大圈回到原点,原来以为是这个不支持那个不支持,原来问题一直在自己的编码环境设置上啊。
果断在自动填写表格的代码中,用
Import pyperclip
pyperclip.copy('浮世繁华')
替换到之前的subprocess解决方案。
啥也不说了,我先哭一会儿去~~~