diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-06-25 13:02:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-25 13:02:43 (GMT) |
commit | 3939c321c90283b49eddde762656e4b1940e7150 (patch) | |
tree | f2b8429629e80925feac81280c7696a16a0328ea /Python/initconfig.c | |
parent | 080b6b40fa6c6ddc79dcfcadab575bb1be3f47e9 (diff) | |
download | cpython-3939c321c90283b49eddde762656e4b1940e7150.zip cpython-3939c321c90283b49eddde762656e4b1940e7150.tar.gz cpython-3939c321c90283b49eddde762656e4b1940e7150.tar.bz2 |
bpo-20443: _PyConfig_Read() gets the absolute path of run_filename (GH-14053)
Python now gets the absolute path of the script filename specified on
the command line (ex: "python3 script.py"): the __file__ attribute of
the __main__ module, sys.argv[0] and sys.path[0] become an absolute
path, rather than a relative path.
* Add _Py_isabs() and _Py_abspath() functions.
* _PyConfig_Read() now tries to get the absolute path of
run_filename, but keeps the relative path if _Py_abspath() fails.
* Reimplement os._getfullpathname() using _Py_abspath().
* Use _Py_isabs() in getpath.c.
Diffstat (limited to 'Python/initconfig.c')
-rw-r--r-- | Python/initconfig.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Python/initconfig.c b/Python/initconfig.c index 66b1b30..9c4cfbe 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2137,6 +2137,11 @@ config_update_argv(PyConfig *config, Py_ssize_t opt_index) /* Force sys.argv[0] = '-m'*/ arg0 = L"-m"; } + else if (config->run_filename != NULL) { + /* run_filename is converted to an absolute path: update argv */ + arg0 = config->run_filename; + } + if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { @@ -2183,6 +2188,37 @@ core_read_precmdline(PyConfig *config, _PyPreCmdline *precmdline) } +/* Get run_filename absolute path */ +static PyStatus +config_run_filename_abspath(PyConfig *config) +{ + if (!config->run_filename) { + return _PyStatus_OK(); + } + +#ifndef MS_WINDOWS + if (_Py_isabs(config->run_filename)) { + /* path is already absolute */ + return _PyStatus_OK(); + } +#endif + + wchar_t *abs_filename; + if (_Py_abspath(config->run_filename, &abs_filename) < 0) { + /* failed to get the absolute path of the command line filename: + ignore the error, keep the relative path */ + return _PyStatus_OK(); + } + if (abs_filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + PyMem_RawFree(config->run_filename); + config->run_filename = abs_filename; + return _PyStatus_OK(); +} + + static PyStatus config_read_cmdline(PyConfig *config) { @@ -2208,11 +2244,22 @@ config_read_cmdline(PyConfig *config) goto done; } + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + status = config_update_argv(config, opt_index); if (_PyStatus_EXCEPTION(status)) { goto done; } } + else { + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + } if (config->use_environment) { status = config_init_env_warnoptions(config, &env_warnoptions); |