Python subprocess.Popen() 不传输 ® 符号,而是将文字字母 'r' 作为参数转换为批处理文件

Posted

技术标签:

【中文标题】Python subprocess.Popen() 不传输 ® 符号,而是将文字字母 \'r\' 作为参数转换为批处理文件【英文标题】:Python subprocess.Popen() does not transfer ® symbol and instead translates the literal letter 'r' as argument to batch filePython subprocess.Popen() 不传输 ® 符号,而是将文字字母 'r' 作为参数转换为批处理文件 【发布时间】:2021-09-28 02:11:27 【问题描述】:

我正在编写一个 Python 脚本来运行一个批处理文件,并为其提供几个参数以在整个批处理脚本中输入。不幸的是,当我遇到特殊字符 ® 时,批处理脚本将其识别为文字字母“r”。我的代码目前看起来像这样(以及我尝试过但后来注释掉的一堆代码。我还留下了我的 cmets,以便您了解我尝试过的内容以及我的心态在哪里):

    item = subprocess.Popen('"file.bat", , , , '.format(arg1, arg2, arg3, arg4), universal_newlines=True, encoding='utf-8', stdin=subprocess.PIPE, stdout=subprocess.PIPE) #stdin=subprocess.PIPE #shell=True # Manually added ^® to input which also failed. CMD recognizes ® but displays 'r' when typing. 
    # item = item.communicate(str.encode("utf-8"))
    # data = item.communicate()
    # print(data[0])
    for line in item.stdout:
        print(line) # .decode('utf-8')

    # Since windows displays 'r' but still recognizes the character as ®, the process is interpretting the literal text on the prompt. Need to interpret the value. Tried encoding parameters to no avail. 
    # Try stdin=subprocess.PIPE with encode('utf-8)
    # Try removing r in beginning of .Popen

我的参数用双引号括起来。

我尝试了几种编码“utf-8”的变体

我尝试使用 r'"file.bat", , , , ' 将 Popen 读取为字符串文字

我注意到,当我将 ® 粘贴到 Visual Studio Code 终端时,它最初会显示为“r”,但是如果我回显它,结果显示将是 ®。

我尝试使用转义字符 ^®

【问题讨论】:

【参考方案1】:

我以迂回的方式解决了这个问题。看起来通过将参数传递给 python.exe 可以完全避免。

我将 ASCII 表的 extended version (批处理文件不支持的字符)复制粘贴到一个文本文件中,然后将其保存为 excel 作为一个制表符分隔的文件,编码为“utf-8”。从那里我使用 Pandas 将其作为数据框阅读。

    df = pd.read_csv('extended_ascii.csv')
    for index, row in df.iterrows():
        char = row['Symbol']
        BIN = row['BIN']
        arg1 = arg1.replace(char, "BIN" + str(BIN))
        arg2 = arg2.replace(char, "BIN" + str(BIN))
        arg3 = arg3.replace(char, "BIN" + str(BIN))
        arg4 = arg4.replace(char, "BIN" + str(BIN))

-运行批处理文件-

返回python脚本:

    for line in Lines:
        for index, row in df.iterrows():
            char = row['Symbol']
            BIN = row['BIN']
            line = line.replace("BIN" + str(BIN), char)

我的任何参数文本都不太可能包含 BIN########,这似乎是使用此方法的唯一弱点。

【讨论】:

以上是关于Python subprocess.Popen() 不传输 ® 符号,而是将文字字母 'r' 作为参数转换为批处理文件的主要内容,如果未能解决你的问题,请参考以下文章

python中的subprocess.Popen()使用

Python subprocess.Popen PIPE和SIGPIPE

查找 subprocess.Popen python 的执行时间

杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]

python中的subprocess.Popen | 9

Python subprocess.Popen 用于多个 python 脚本