带有python的CLI脚本,带有包含特殊ch的变量

2024-06-30 17:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python运行CLI脚本,但是由于特殊字符,我遇到了一些问题。 所以如果我运行这个程序,它就可以正常工作。 将“Innjsø”层写入名为“innsjo”的数据库作为表名。你知道吗

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=postgres  password=postgres "C:\path\GML.gml" Innsjø -nln innsjo

然而,我试图以编程的方式运行它,却遇到了特殊字符的问题。你知道吗

command = [
        "C:\\Program Files\\QGIS 2.18\\bin\\ogr2ogr.exe",
        "-f",
        "PostgreSQL",
        "PG:host=localhost user=postgres password=postgres
        loadfile,
        gml_layer_name,
        "-nln", set_table_name
    ]

subprocess.check_call(command)

如果变量layer\u name包含特殊字符,则会出现此错误。只使用拉丁字符的图层效果很好。你知道吗

ERROR 1: Couldn't fetch requested layer 'Innsj°'!

我无法控制GML文件中的层被称为什么。如何使用名称包含特殊字符的python运行CLI脚本?你知道吗


Tags: name脚本layerlocalhosthostclipostgresqlpostgres
1条回答
网友
1楼 · 发布于 2024-06-30 17:23:35

我可以用一个小小的C程序转储其参数的代码点来部分复制。所发生的是,Windows上的python3是一个完全支持unicode的程序,因此subprocess使用underhood CreateProcessW并用宽字符传递命令行。因此,当子程序使用窄字符时,Windows会将宽字符转换为默认的ANSI代码页,即用于西欧语言的CP1252。你知道吗

具体来说,似乎没有使用控制台代码页。你知道吗

因此,最可靠的方法是使用控制台中的1252代码页:chcp 1252。你知道吗

问题是,如果层名称存储为cp850字节字符串,那么现在所有非ASCII字符的值都会错误。你知道吗

在这种情况下,一种可能的解决方法是将字符串编码为cp850,并将其解码为cp1252。这样,当系统库将其编码为cp1252时,您将得到预期的cp850值。你知道吗

它将在这里工作,因为'ø'.encode('cp850').decode('cp1252')存在(它是字符U+203A单右指角引号)。所以这应该有效:

command = [
        "C:\\Program Files\\QGIS 2.18\\bin\\ogr2ogr.exe",
        "-f",
        "PostgreSQL",
        "PG:host=localhost user=postgres password=postgres
        loadfile,
        gml_layer_name.encode('cp850').decode('cp1252'),
        "-nln", set_table_name
    ]

subprocess.check_call(command)

(*)如需参考,以下是用于转储命令行参数的代码点的C代码:

#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, TCHAR *argv[]) {
    for (int i = 0; i < argc; i++) {
        _tprintf(_T(">%s< "), argv[i]);

        for (TCHAR *c = argv[i]; *c != 0; c++) {
            _tprintf(_T("%02x "), (unsigned)(_TUCHAR)*c);
        }
    }
    return 0;
}

相关问题 更多 >