On Monday, October 7, 2013, Maria McKinley wrote: > So, they are using optparse. Is there a way to take advantage of this? > > When I tried to use the sys.argv=[], I found that having the first option > None gave me a TypeError. If I used: > > import sys > sys.argv = ['-stest'] > > I'd use sys.arv.extend or .append, rather than replace it. So the first arg is right.
> I get this: > > Usage: -stest [options] > > -stest: error: Please specify a subject ID with '-s'. > > That sure looks like there is supposed to be a space between the s and test: -s test or -stest subject_id MAke sure you can run it on the command line the way you want before emulating it. So it might be: sys.argv.append('-s') sys.argv.append('Id') HTH Chris Does this make sense to anyone? Same results for sys.argv.extend > > I've put the relevant bits of the full trace for the TypeError below > (that was the only time I got a full trace). > > ~m > > DirectStart: Starting the game. > Warning: NodePathCollection.asList() is no longer needed and deprecated. > Iterat > e on the collection directly instead. > Known pipe types: > wglGraphicsPipe > (all display modules loaded.) > Traceback (most recent call last): > File "test_goBananas.py", line 2, in <module> > import goBananas > File "c:\Users\eblab.WANPRC\panda\goBananas\goBananas.py", line 35, in > <module > > > goBananas().start() > File "c:\Users\eblab.WANPRC\panda\goBananas\goBananas.py", line 11, in > __init_ > _ > exp = epl.Experiment.getInstance() > File "c:\Panda3D-1.8.1\python\lib\site-packages\pandaepl\Experiment.py", > line > 86, in getInstance > Experiment.singletonInstance = Experiment() > File "c:\Panda3D-1.8.1\python\lib\site-packages\pandaepl\Experiment.py", > line > 51, in __init__ > Options.getInstance().error("Please specify a subject ID with '-s'.") > File "c:\Panda3D-1.8.1\python\lib\optparse.py", line 1582, in error > self.print_usage(sys.stderr) > File "c:\Panda3D-1.8.1\python\lib\optparse.py", line 1602, in print_usage > print >>file, self.get_usage() > File "c:\Panda3D-1.8.1\python\lib\optparse.py", line 1588, in get_usage > self.expand_prog_name(self.usage)) > File "c:\Panda3D-1.8.1\python\lib\optparse.py", line 1565, in > expand_prog_name > > return s.replace("%prog", self.get_prog_name()) > File "c:\Panda3D-1.8.1\python\lib\optparse.py", line 1560, in > get_prog_name > return os.path.basename(sys.argv[0]) > File "c:\Panda3D-1.8.1\python\lib\ntpath.py", line 198, in basename > return split(p)[1] > File "c:\Panda3D-1.8.1\python\lib\ntpath.py", line 170, in split > d, p = splitdrive(p) > File "c:\Panda3D-1.8.1\python\lib\ntpath.py", line 125, in splitdrive > if p[1:2] == ':': > TypeError: 'NoneType' object has no attribute '__getitem__' > > > > On Mon, Oct 7, 2013 at 4:28 PM, Rohit Patnaik <quanti...@gmail.com> wrote: > > Can you see how they're getting the command line options? The sensible > thing would be to use something like optparse, but from your description, I > suspect they're not doing the sensible thing. > On Oct 7, 2013 4:22 PM, "Maria McKinley" <mar...@mariakathryn.net> wrote: > > I couldn't get either the sys.argv.extend or sys.argv = [None...] to work. > I just keep getting the error to specify that option. They do specify it > kind of strangely. the option is script.py -sName > which I've never seen before. They just kind of run the option name and > the argument together. I tried all kinds of variations > '-sname' > '-s', 'name' > '-s=name' > 's=name' > > Nothing works. This library doesn't seem to have an option for running it > directly from the python API. I'm thinking their library was not tested > with actual test code. Meh. > > I'm contemplating mucking with their code to set a default for their > 'mandatory' option, but I'd really rather not do that. > > And yes, testing it as a script would not be unit testing. I'm not sure > what I was imagining there. ;-) > > thanks, > Maria > > > On Mon, Oct 7, 2013 at 4:08 PM, Matt S. <sleepingb...@gmail.com> wrote: > > Chris beat me to the punch but here's what I was thinking... > > http://docs.python.org/2/library/optparse.html > > 15.5.3.7 Parsing arguments > (options, args) = parser.parse_args(args=None, values=None) > > > > where the input parameters are > args -- the list of arguments to process (default: sys.argv[1:]) > > > It looks to me like you just need to emulate sys.argv[1:]. > > ./myscript.py -a val1 -b val2 > > > Maybe a bad idea but I think if you import sys and then define sys.argv as > a list whose first item is going to be ignored: > > if __name__=='__main__': > > sys.argv = [None, "-a", "val1", "-b", "val2"] > > start() > > > > > > > > On Mon, Oct 7, 2013 at 3:31 PM, Maria McKinley <mar...@mariakathryn.net>wrote: > > I am using a python package that has a required command line option I am > suppose to use when I invoke my script if I am using their library. Kind of > weird, I know, I love required options! I want to load my class from the > python interpreter for testing purposes. Is there a way to specify options > from the python interpreter? I know that __main__ is run from the command > line, so I should be able to add stuff in an if statement that ch > > -- Christopher Barker, PhD Python Language Consulting - Teaching - Scientific Software Development - Desktop GUI and Web Development - wxPython, numpy, scipy, Cython