blove
1
系统 : Windows7 SP1 x64
Emacs 版本 : 27.2
目的是使用 emacs 的 shell-commad 命令调用外部 python 脚本,处理数据。
python 脚本内容
# c:/test.py
import sys
print(sys.argv[1])
emacs 的 shell-command 命令
(setq arg "가게")
(shell-command (concat "pyton -X utf8 c:/test.py " arg))
想通过这一调用命令正确输出 "가게"
但是,从 shell-command 传递地出去的参数,编码无法正确被 python 正确转码。所以输出结果不正确,是乱码。
即使在 emacs 中使用 encode-coding-string、decode-coding-string,在 python 中使用 decode()、encode()得到的结果都是乱码。
而同样的命令,同样的 python 脚本,在 linux 中 shell-command 传递的参数就不会有乱码,能够正确被 python 识别。
所以很想知道,在 Windows 中,shell-command 传递出去的参数应该如何正确转码?或者 python 接收 shell-command 传递过来的参数,应该如何转码?
blove
2
主要用途是在当前文本中取词作为参数,通过 shell-command 传递出去给外部的 python 脚本,以实现更多处理。比如在本地词典数据中搜索,或将该参数作为关键词爬取网站数据,处理后输出结果。也就是
(word-at-point)
或
(buffer-substring-no-properties (region-beginning) (region-end))
的内容作为 shell-command 向 python 传递的参数,供python使用。目标功能已经在 linux 中实现。
目前在 Windows 平台遇到编码问题!希望能找到方法,解决传递出去参数编码能够被 python 正确识别使用!
blove
4
可以用其它方式,比如读取输入,文件,管道。下面是读取输入的例子
arg = input()
print(arg)
print("这是中文 : 中文")
print("이거 한국 글 : 가게")
(with-temp-buffer
(insert "가게 中文")
(shell-command-on-region (point-min) (point-max) "python -X utf8 D:/Code/test.py")
)
1 个赞
wsug
6
效仿浏览器,在elisp中将文本作url编码,python收到后,在进行url解码,我是这么解决的 基于 ripgrep 的代码搜索和重构工具 - #143,来自 wsug
2 个赞
blove
7
试了下这个方法,通过 url-encode-url 确实有效解决了这个问题!感谢提供参考!
具体实验过程
python 脚本部分
import sys
import platform
if "Windows" == platform.system():
from urllib.parse import unquote
print(unquote(sys.argv[1]))
else:
print(sys.argv[1])
lisp 部分
(if (memq window-system '(w32 pgtk))
(setq arg (url-encode-url "그리고"))
(setq arg "그리고")
)
(shell-command (concat "python -X utf8 c:/myTemp/test.py " arg))
在 Windows 中输出了正确结果
应用到具体功能中也得到了希望的效果
blove
8