我试图在visual studio 2015中运行python脚本,我想指定一个到我的arparse函数的路径,但是一直接收OSError。请参阅更新问题似乎是argparse如何从命令而不是bash行为接收值的区别。
我是否像这样指定
C:\Users\Sayth\Documents\Racing\XML\*xml
或者像这样
C:\\Users\\Sayth\Documents\\Racing\\XML\\*xml
我收到一条未找到路径的OSError
OSError: Error reading file 'C:\\Users\\Sayth\\Documents\\Racing\\XML\\*xml': failed to load external entity "file:/C://Users//Sayth/Documents//Racing//XML//*xml"
更新 我将脚本和XML文件复制到了测试目录。从这里开始,我在Windows上的2个不同的shell上运行脚本。
在命令 cmd
上C:\Users\Sayth\Projects
λ python RaceHorse.py XML\*xml
Traceback (most recent call last):
File "RaceHorse.py", line 42, in <module>
tree = lxml.etree.parse(file)
File "lxml.etree.pyx", line 3427, in lxml.etree.parse (src\lxml\lxml.etree.c:79720)
File "parser.pxi", line 1782, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:115914)
File "parser.pxi", line 1808, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:116264)
File "parser.pxi", line 1712, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:115152)
File "parser.pxi", line 1115, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:109849)
File "parser.pxi", line 573, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:103323)
File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:104977)
File "parser.pxi", line 611, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:103843)
OSError: Error reading file 'XML\*xml': failed to load external entity "XML/*xml"
当我将其更改为 git bash 时 它读取文件我得到一个错误,但它显示它的工作。
Sayth@renshaw-laptop ~/Projects
λ python RaceHorse.py XML/*xml
Traceback (most recent call last):
File "RaceHorse.py", line 50, in <module>
nomination_table.append([race_id] + [nomination.attrib[name] for name in horseattrs])
File "RaceHorse.py", line 50, in <listcomp>
nomination_table.append([race_id] + [nomination.attrib[name] for name in horseattrs])
File "lxml.etree.pyx", line 2452, in lxml.etree._Attrib.__getitem__ (src\lxml\lxml.etree.c:68544)
KeyError: 'race_id'
我有一个简单的argparse函数
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("files", nargs="+")
return parser.parse_args()
fileList = GetArgs(parser)
更新2 根据评论我试图实现glob来启用windows shell。 glob返回一个错误,它的对象解析器没有对象len。
更新的glob解析器
def GetArgs(parser):
"""Parser function using argparse"""
# parser.add_argument('directory', help='directory use',
# action='store', nargs='*')
parser.add_argument("files", nargs="+")
files = glob.glob(parser.parse_args())
return files
filelist = GetArgs(parser)
返回此错误。
TypeError was unhandled by user code
Message: object of type 'Namespace' has no len()
答案 0 :(得分:1)
以下内容应该适用于Windows cmd
shell和bash,因为它会为它收到的任何文件名(如果shell没有这样做,可能会发生):
import argparse
from glob import glob
parser = argparse.ArgumentParser(description=None)
def GetArgs(parser):
"""Parser function using argparse"""
parser.add_argument("files", nargs="+")
namespace = parser.parse_args()
files = [filename for filespec in namespace.files for filename in glob(filespec)]
return files
filelist = GetArgs(parser)
但是,我不认为让GetArgs()
为它传递的解析器添加参数是一个很好的设计选择(因为如果重用parser
对象可能会产生不良的副作用)
答案 1 :(得分:1)
即使非常简短也很简单我仍然认为值得回答的不仅是评论,因为python是多平台的,因此当你使用路径时,你应该更喜欢使用
from os import path
以避免在不同平台上运行您的应用时出现问题