Windows 中,emacs 的 shell-command 传递参数,作为 python 的 argv[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 传递过来的参数,应该如何转码?

主要用途是在当前文本中取词作为参数,通过 shell-command 传递出去给外部的 python 脚本,以实现更多处理。比如在本地词典数据中搜索,或将该参数作为关键词爬取网站数据,处理后输出结果。也就是

(word-at-point)

(buffer-substring-no-properties (region-beginning) (region-end))

的内容作为 shell-command 向 python 传递的参数,供python使用。目标功能已经在 linux 中实现。




目前在 Windows 平台遇到编码问题!希望能找到方法,解决传递出去参数编码能够被 python 正确识别使用! :pray:

没有办法处理,见下面这个 BUG

Passing unicode filenames to start-process on Windows? (gnu.org)

1 个赞

好的!感谢告知! :blush: :handshake:
这样看来,得暂时放弃在 Windows 平台上的实现了! :grin:

可以用其它方式,比如读取输入,文件,管道。下面是读取输入的例子

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 个赞

效仿浏览器,在elisp中将文本作url编码,python收到后,在进行url解码,我是这么解决的 基于 ripgrep 的代码搜索和重构工具 - #143,来自 wsug

2 个赞

试了下这个方法,通过 url-encode-url 确实有效解决了这个问题!感谢提供参考! :+1:
具体实验过程

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 中输出了正确结果



应用到具体功能中也得到了希望的效果

实测,这个方法完全有效,可以输出正确结果!厉害 :+1: :smile:在我的预期效果中,传递的参数包括 (word-at-point) 方式或选定 region 任意一种
感觉 shell-command-on-region 这种方法,很适合 region 作为参数时使用!再次感谢! :+1: :+1: :+1: