Issue #18395, #22108: Update embedded Python examples to decode correctly

command line parameters: use Py_DecodeLocale() and PyUnicode_DecodeFSDefault().
This commit is contained in:
Victor Stinner 2014-08-01 12:28:49 +02:00
parent f6a271ae98
commit 25e014bd91
4 changed files with 40 additions and 9 deletions

View File

@ -134,6 +134,9 @@ Process-wide parameters
change for the duration of the program's execution. No code in the Python change for the duration of the program's execution. No code in the Python
interpreter will change the contents of this storage. interpreter will change the contents of this storage.
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string.
.. c:function:: wchar* Py_GetProgramName() .. c:function:: wchar* Py_GetProgramName()
@ -243,6 +246,9 @@ Process-wide parameters
:data:`sys.exec_prefix` to be empty. It is up to the caller to modify these :data:`sys.exec_prefix` to be empty. It is up to the caller to modify these
if required after calling :c:func:`Py_Initialize`. if required after calling :c:func:`Py_Initialize`.
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string.
.. c:function:: const char* Py_GetVersion() .. c:function:: const char* Py_GetVersion()
@ -339,6 +345,9 @@ Process-wide parameters
:data:`sys.path`, which is the same as prepending the current working :data:`sys.path`, which is the same as prepending the current working
directory (``"."``). directory (``"."``).
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string.
.. note:: .. note::
It is recommended that applications embedding the Python interpreter It is recommended that applications embedding the Python interpreter
for purposes other than executing a single script pass 0 as *updatepath*, for purposes other than executing a single script pass 0 as *updatepath*,
@ -363,6 +372,9 @@ Process-wide parameters
to 1 unless the :program:`python` interpreter was started with the to 1 unless the :program:`python` interpreter was started with the
:option:`-I`. :option:`-I`.
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string.
.. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`. .. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`.
@ -377,6 +389,9 @@ Process-wide parameters
execution. No code in the Python interpreter will change the contents of execution. No code in the Python interpreter will change the contents of
this storage. this storage.
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string.
.. c:function:: w_char* Py_GetPythonHome() .. c:function:: w_char* Py_GetPythonHome()

View File

@ -58,12 +58,18 @@ perform some operation on a file. ::
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
Py_SetProgramName(argv[0]); /* optional but recommended */ wchar_t *program = Py_DecodeLocale(argv[0], NULL);
Py_Initialize(); if (program == NULL) {
PyRun_SimpleString("from time import time,ctime\n" fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
"print('Today is', ctime(time()))\n"); exit(1);
Py_Finalize(); }
return 0; Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n");
Py_Finalize();
PyMem_RawFree(program);
return 0;
} }
The :c:func:`Py_SetProgramName` function should be called before The :c:func:`Py_SetProgramName` function should be called before
@ -160,7 +166,7 @@ for data conversion between Python and C, and for error reporting. The
interesting part with respect to embedding Python starts with :: interesting part with respect to embedding Python starts with ::
Py_Initialize(); Py_Initialize();
pName = PyUnicode_FromString(argv[1]); pName = PyUnicode_DecodeFSDefault(argv[1]);
/* Error checking of pName left out */ /* Error checking of pName left out */
pModule = PyImport_Import(pName); pModule = PyImport_Import(pName);

View File

@ -370,11 +370,17 @@ optionally followed by an import of the module::
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */ /* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("spam", PyInit_spam); PyImport_AppendInittab("spam", PyInit_spam);
/* Pass argv[0] to the Python interpreter */ /* Pass argv[0] to the Python interpreter */
Py_SetProgramName(argv[0]); Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */ /* Initialize the Python interpreter. Required. */
Py_Initialize(); Py_Initialize();
@ -386,6 +392,10 @@ optionally followed by an import of the module::
... ...
PyMem_RawFree(program);
return 0;
}
.. note:: .. note::
Removing entries from ``sys.modules`` or importing compiled modules into Removing entries from ``sys.modules`` or importing compiled modules into

View File

@ -13,7 +13,7 @@ main(int argc, char *argv[])
} }
Py_Initialize(); Py_Initialize();
pName = PyUnicode_FromString(argv[1]); pName = PyUnicode_DecodeFSDefault(argv[1]);
/* Error checking of pName left out */ /* Error checking of pName left out */
pModule = PyImport_Import(pName); pModule = PyImport_Import(pName);