Passing command line argument to program from within IDLE?

A

Alan Biddle

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.
 
T

Terry Reedy

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.

Terry Jan Reedy
 
S

Steve Holden

Terry said:
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?

regards
Steve
 
A

Alan Biddle

Yes, that is what I was trying to do. I need to puzzle a bit on the
solution, being a newbie. Thanks!
 
A

Alan Biddle

Terry,

CLICK, the light just came on. Knowing that it is writable, I can
look at the length to determine whether there are any arguments. If
not, I can switch to interactive input within the program, and input
the values that way. A few easy extra lines. Whatever works.
Thanks!!
 
S

Steven D'Aprano

Terry said:
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?

[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.
 
S

Steve Holden

Steven said:
Terry said:
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?

[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. But then I have come to the
conclusion that IDLE doesn't fit my brain, or my brain doesn't fit it.

That sys.argv is mutable simply reflects the fact that it's a list.

regards
Steve
 
J

John Bokma

Steven D'Aprano said:
Terry said:
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?

[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.

I guess that Terry means that a solution that makes it possible to
specify in IDLE *outside* of the Python code the arguments would be
better. Hardcoding the command line arguments isn't something I would do
for testing.
 
J

John Bokma

John Bokma said:
Steven D'Aprano 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?

[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.

I guess that Terry means that a solution that makes it possible to
specify in IDLE *outside* of the Python code the arguments would be
better. Hardcoding the command line arguments isn't something I would do
for testing.

Oops, that should've been Steve, my apologies.
 
T

Terry Reedy

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
 
S

Steven D'Aprano

Am I the only one that expected that issue to be about too many Steves
(and perhaps too many Tims) on c.l.p? :)


That was exactly my thought too.


One of the multiple Steves'ly yrs,
 
J

John Bokma

Tim Chase said:
Am I the only one that expected that issue to be about too many Steves
(and perhaps too many Tims) on c.l.p? :)

Ha ha ha, yeah something like that, wasn't expecting what was actually
on that page.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top