【发布时间】:2016-09-15 21:46:43
【问题描述】:
在我的例子中,我将 Python 嵌入到我的应用程序中。当我的应用程序路径包含非 latin-1 字符时,Py_Initialize 在内部调用 exit(1)(稍后会提供更多信息)。
所以我检查了是否可以使用标准解释器可执行文件重现此内容。
当 PYTHONHOME 的路径包含 latin-1 字符集之外的字符时,Windows 上的 Python-2.7.x 似乎不起作用。问题是模块 site 无法找到并导入。由于变音符号似乎有效,这里的实际限制是什么?仅支持 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)
^
有什么想法吗?
背景:
我还没有逐步完成代码,但是当 site 不可用时,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);
}
...
}
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
【问题讨论】:
-
你试过用 Python 3 代替吗?他们重做了 Unicode 处理,而且更干净。我的建议实际上是尽可能使用 3,仅在必要时使用 2。
-
在 Python 3 中它(应该)工作/秒,是的。我必须坚持使用 Python 2,因为这是我们嵌入到我们软件中的版本,不过将来会发生变化。
-
您能详细说明您是如何在您的应用程序中“嵌入”Python 的吗?从 C/C++ 调用它?你使用的机制是什么?你设置了 PYTHONHOME 吗?如果是这样,你如何设置它?作为旁注,OS FS wrt 到 unicode 路径的行为在 Windows、Mac 和 Linux/POSIX 上变化很大。在 CPython 2 中处理这个问题的方法有时需要一些摆弄......虽然我确实成功地与它搏斗了几次
-
使用 C API 中的 Py_Initialize, ...。我尝试了 PYTHOMHOME 和相应的 C 函数(Py_SetPath、Py_SetPythonhome、...),但没有成功。顺便说一句,如果安装在给定的路径上,Python 2.7(没有嵌入)也不起作用。
-
MS Windows 与 OS X 的不同之处在于那里的基本字符集是 UTF-16。对于后向代码,它还提供了一个“ANSI”API,它使用单字节字符串,但不能表示整个 Unicode 范围。我很确定 Python 2 永远不会升级到使用完全支持 Unicode 的 win32 API,所以任何麻烦都是徒劳的,除非你至少升级到 Python 3。
标签: python windows utf-8 latin1