New submission from Jan-Philip Gehrcke:
When Python is invoked with the `-c command` switch, the command string does
not get exposed in sys.argv:
$ python -c "import sys; print(sys.argv)"
['-c']
$ python -c "import sys; print(sys.argv)" arg1
['-c', 'arg1']
The command string does not get exposed anywhere, AFAIK, so it is inaccessible
from within Python programs. There might be application scenarios in which it
is useful to access the command string, such as for debugging purposes. One
scenario is when a Python session should be able to "re-spawn" itself in a
subprocess (I came across this question on StackOverflow:
http://stackoverflow.com/q/28412903/145400)
I propose to make the command string accessible. If you agree that it might
make sense, the question is *how/where* to expose it.
One possible way is to retain it in sys.argv, as in this example:
$ python -c "import sys; print(sys.argv)" "arg1"
['-c', 'import sys; print(sys.argv)', 'arg1']
The current sys.argv docs say
> If the command was executed using the -c command line option to
> the interpreter, argv[0] is set to the string '-c'.
This sentence could then be adjusted to
"[...], argv[0] is set to the string '-c', and argv[1] contains the command."
This method breaks existing applications that are started with the -c method
and that consume command line arguments in a sys.argv[1:] fashion. The tests in
Lib/test/test_cmd_line.py all pass, however.
A second method would be to change sys.argv[0] from '-c' to '-c command'. This
would break existing applications that check for sys.argv[0] == 'c'.
A third method would be to leave sys.argv as it is, and expose the command with
a new attribute in the sys module.
I have attached a patch for variant 1 (passes all tests in
Lib/test/test_cmd_line.py), to demonstrate which code is affected: the
translation from the "real" argv to sys' argv is triggered in Modules/main.c.
The patch does not change behavior of '-m' (it's funny, however, that the
current version of main.c at first replaces the module string with '-m',
whereas the runpy module later on replaces '-m' with the path to the module
file anyway.).
As a side node, I figure that the sys.argv documentation should be adjusted to
properly reflect the -m behavior, which is:
$ ./python -m testmodule foo
testmodule sys.argv:
['/data/local/pythondev/pythontip/cpython/testmodule.py', 'foo']
Let me hear your comments, and I am willing to work on code and doc patches,
thanks!
----------
assignee: docs@python
components: Documentation, Interpreter Core
files: sys_argv_cmd.patch
keywords: patch
messages: 235633
nosy: docs@python, georg.brandl, haypo, jgehrcke, pitrou
priority: normal
severity: normal
status: open
title: Python should expose command when invoked with -c
type: enhancement
versions: Python 3.5, Python 3.6
Added file: http://bugs.python.org/file38065/sys_argv_cmd.patch
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue23427>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com