Steven said:
Terry Reedy wrote:
On 2/4/2010 3:55 PM, Alan Biddle wrote:
Just finishing my first Python (2.6 on Win XP) program, which is
working fine. My "Duh?" question is about how to run it from within
IDLE and pass it command line arguments. No problem using sys.argv
from a Windows command line, but I have missed how you can do that
from within IDLE, which complicates development and debugging.
I presume you mean edit, F5-run, see result in shell window. Set
sys.argv in test function or __name__=='__main__' In 3.1 idle shell:
import sys
sys.argv
['']
sys.argv = ['abc','dev']
sys.argv
['abc', 'dev']
I did not know it was writable, either, until I tried it.
As a solution, however, that sucks, wouldn't you agree?
No, see below.
[scratches head]
Do you mean setting sys.argv as a solution sucks? No, I don't, I think it
is grand. If sys.argv was unmodifiable, *that* would suck.
Or do you mean that trying it as a solution to the problem of answering
the OP's question sucks? Well, no, experimentation is good for answering
these sorts of questions, and I can't assume that the documentation will
cover every imaginable use-case, or that users will find it. In the
absence of any documentation stating otherwise, I would have assumed that
sys.argv was an ordinary list which you can modify at will, but having
been caught out on faulty assumptions before, I would try it and see
before commenting publicly.
What I meant was it sucks that IDLE has no way to fill in sys.argv as a
part of its "Run Module" functionality - something that is present in
both PythonWin and Wing IDE, for example.
The first thing I did was to check for such an option on the run tab.
The second thing I thought of was to suggest to OP that he file a
feature request (which would likely take years, if ever). But then the
test line would not be fetched from the file (unless some ##cmdline
convention were invented), but would have to be hand-entered each time
the editor were run. Also, a given run of a program can have only one
command line, and changing the run line for each test case would suck.
Then I tried sys.argv.
Why that does not suck:
A Python program, as far as I know, cannot process a command lines
directly, but only processed command line args in the form of a list of
strings -- sys.argv. Therefore, the need for testing is not to simulate
a command line but to set sys.argv. I assume the programmer knows the
mapping from command line to argv since he otherwise cannot sensibly
proceed.
I believe it is sensible, if not recommended, to put an arg processing
in a defined function that returns, for instance, a dict, rather than to
do it at top-level in the main script. So in use, process_args() will be
called in a context with sys.argv set. So let it be tested. For
instance, something like:
def _test_arg_processing:
arg_dict_pairs - (
(['arg1', 'arg2'], {'speed':int('arg1'), 'range':float('arg2'}),
(['-v'], {'verbose': True},
)
for args,dic in arg_dict_pairs:
sys.argv = args
assert process_args() == dic
Repeatable automatic testing of multiple test cases.
I just starting doing this a year ago and love it.
Terry Jan Reedy