Passing command line argument to program from within IDLE?

Terry Reedy tjreedy at udel.edu
Fri Feb 5 01:10:52 CET 2010


On 2/4/2010 6:29 PM, Steve Holden wrote:
> Steven D'Aprano wrote:
>> On Thu, 04 Feb 2010 16:28:17 -0500, Steve Holden wrote:
>>
>>> 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




More information about the Python-list mailing list