Kaydet (Commit) 25e014bd authored tarafından Victor Stinner's avatar Victor Stinner

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

command line parameters: use Py_DecodeLocale() and PyUnicode_DecodeFSDefault().
üst f6a271ae
...@@ -134,6 +134,9 @@ Process-wide parameters ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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()
......
...@@ -58,12 +58,18 @@ perform some operation on a 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 ...@@ -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);
......
...@@ -370,11 +370,17 @@ optionally followed by an import of the module:: ...@@ -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:: ...@@ -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
......
...@@ -13,7 +13,7 @@ main(int argc, char *argv[]) ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment