Python与非latin-1 PYTHONHOME路径

Hel*_*rld 10 python windows utf-8 latin1

就我而言,我将Python嵌入到我的应用程序中.当我的应用程序的路径包含非latin-1字符时,Py_Initialize在内部调用exit(1)(稍后会有更多信息).

所以我检查了是否可以使用标准解释器可执行文件重现这一点.

当PYTHONHOME的路径包含latin-1字符集之​​外的字符时,Windows上的Python-2.7.x似乎不起作用.问题是无法找到并导入模块站点.由于变音符号似乎有效,这里的实际限制是什么?只支持latin-1吗?那为什么它适用于OSX呢?

C:\Users\?\Python27\python.exe    // fails to start (KOI8-R)
         ^
C:\Users\?\Python27\python.exe    // fails to start (latin-3)
         ^
C:\Users\ä\Python27\python.exe    // works fine (latin-1)
         ^
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

背景:

我还没有完成代码,但是当站点不可用时,Python 2.6和Python 2.7的行为也不同.Py 2.6只打印一条消息,Py 2.7拒绝启动.

static void
initsite(void)
{
    PyObject *m;
    m = PyImport_ImportModule("site");
    if (m == NULL) {
        ...

        // Python 2.7 and later
        exit(1);

        // Python 2.6 and prior
        PyFile_WriteString("'import site' failed; traceback:\n", f);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Python 2.7:https://github.com/enthought/Python-2.7.3/blob/master/Python/pythonrun.c#L725

Python 2.6:https://github.com/python-git/python/blob/master/Python/pythonrun.c#L705

Ser*_*sta 2

我认为问题在于,Python2 在内部将所有内容处理为平台系统编码中的字节字符串,该平台系统编码(在西欧)CP1252 是 Latin-1 的变体。因此,它无法正确处理包含其他字符的 PYTHONHOME 路径也就不足为奇了

但是,当我年轻的时候,我习惯了 MS/DOS 文件的旧 8.3 格式......

我仍然可以在 Windows 7 框中的DIR /X 控制台 (CMD.EXE) 窗口中查看(并使用它们)。此格式仅使用 ASCII 大写字符和 tilda ( ~),因此它可以用作解决方法:只需在环境变量 PYTHONHOME 中声明 8.3 路径,并使用该 8.3 路径启动 python。

顺便说一句,建议 PYTHONHOME 使用既不包含特殊字符也不包含空格的路径。它可以工作,但可能会导致其他模块出现问题