Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Trouble porting glob bash behavior with argparse to windows shell

68 views
Skip to first unread message

Sayth Renshaw

unread,
May 3, 2016, 7:34:23 AM5/3/16
to
Hi

I had a simple argparse working on ubuntu bash. However now I am trying to run the script on windows and it cannot work because cmd doesn't handle the glob like bash does.

So I am attempting to modify my script to accommodate.

As i am running python 3.5 i can use glob.glob for a list of files I believe.

Now I am specifying my arguments as 2 arguments path and extension

python script.py /mypath/XML *xml

This is my current error I have had many.

TypeError was unhandled by user code
Message: can only concatenate list (not "str") to list
'
import argparse
import glob


parser = argparse.ArgumentParser(description=None)


def GetArgs(parser):
"""Parser function using argparse"""
# parser.add_argument('directory', help='directory use',
# action='store', nargs='*')

parser.add_argument("path", nargs="+")
parser.add_argument('-e', '--extension', default='', help='File extension to filter by.')
args = parser.parse_args()

files = set()
files |= set(glob.glob(args.path + '/*' + args.extension))
return files


fileList = GetArgs(parser)
for file in fileList:
print(file)


At this became unsure of where to troubleshoot further.

Sayth

Sayth Renshaw

unread,
May 3, 2016, 4:55:53 PM5/3/16
to
Is there something obvious to this I am doing wrong?

Sayth

Peter Otten

unread,
May 3, 2016, 5:16:15 PM5/3/16
to
Sayth Renshaw wrote:

> Is there something obvious to this I am doing wrong?

> parser.add_argument("path", nargs="+")

The "+" implicitly turns args.path into a list

> files |= set(glob.glob(args.path + '/*' + args.extension))

so the glob() argument is evaluated as

list + str + str

Try

name_pattern = "*" + args.extension
for path in args.path:
files.update(glob.glob(os.path.join(path, name_pattern)))

Terry Reedy

unread,
May 3, 2016, 6:00:53 PM5/3/16
to
On 5/3/2016 4:55 PM, Sayth Renshaw wrote:
> Is there something obvious to this I am doing wrong?
>
> Sayth

Somethin happened so that I don't see what you did. Fortunately, it did
show up for Peter, between the '?' and name, so he could answer.

--
Terry Jan Reedy

Sayth Renshaw

unread,
May 4, 2016, 3:56:26 AM5/4/16
to
Thank you Peter.
I was starting to flail and thought my use of glob.glob was wrong.

As an aside should I be using os.path to negate system inconsistency?

Thanks

Sayth

Sayth Renshaw

unread,
May 4, 2016, 3:57:32 AM5/4/16
to
Oops sorry noticed you did in the glob. Sorry squinting at phone.

Sayth

Sayth Renshaw

unread,
May 15, 2016, 11:21:36 PM5/15/16
to
On Wednesday, 4 May 2016 17:57:32 UTC+10, Sayth Renshaw wrote:
> Oops sorry noticed you did in the glob. Sorry squinting at phone.
>
> Sayth

Hi

this seems to be causing me an error in my thinking as well as the program. I am creating a function GetArgs to take a path and file extension from the command line.

However I cannot call it effectively. I will clrify this is my function

import argparse
import glob
import os
import sqlite3


def GetArgs(parser):
'''parse XML from command line'''
parser.add_argument("path", nargs="+")
parser.add_argument('-e', '--extension', default='',
help='File extension to filter by.')
args = parser.parse_args()

files = set()
name_pattern = "*" + args.extension
for path in args.path:
files.update(glob.glob(os.path.join(path, name_pattern)))
return files

Then later in program I am attempting to call it an a for statement.

filesToProcess = GetArgs()
for meeting in filesToProcess:
meetdata = [meeting.get(attr) for attr in meetattrs]
cur.execute("insert into meetings values (" +
",".join(["%s"] * len(meetattrs)) + ")", meetdata)


this fails as i would expect, however if I declare a list as the GetArgs() argument it fails as well.

Where my confusion is that I created the function to take arguments from the command line, so I don't have that variable to supply until executed.

Have i overbaked the cake?

Sayth

Peter Otten

unread,
May 16, 2016, 2:59:45 AM5/16/16
to
The actual arguments are in sys.argv and will be implicitly accessed by the
parser.parse_args() method invocation. The problem is simply that you don't
create an argparse.ArgumentParser() instance. I suggest that you do that
inside the GetArgs() function:

def GetArgs(): # no arguments
parser = argparse.ArgumentParser()
# your current code below
parser.add_argument("path", nargs="+")
...

0 new messages