【问题标题】:Windows cmd versus bash for sys.argv - Pythonsys.argv 的 Windows cmd 与 bash - Python
【发布时间】:2016-08-27 02:48:41
【问题描述】:

我试图在 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 基于 cmets 我正在尝试实现 glob 以启用 windows shell 的使用。 glob 返回一个错误,它的对象解析器没有对象 len。

更新的全局解析器

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()

【问题讨论】:

  • 看起来有些东西正在(尝试)将您指定的路径更改为其 file URI scheme 等效路径。尝试使用 \\C:\Users\Sayth\Documents\Racing\XML\*xml 之类的东西。
  • sys.argv;这就是 argparse 必须使用的。
  • @martineau 没用。系统。 argv 适用于 bash 不确定这里有什么区别
  • cmd.exe 中的 Glob (*) 由命令而不是 shell 处理(即应用程序在获取 glob 时必须知道该做什么)。 bash 不是这种情况,它用空格分隔所有可能的文件替换 XML\*xml
  • 好吧,我需要在 argparse 中使用 glob

标签: python cmd argparse git-bash


【解决方案1】:

以下内容应该适用于 Windows cmd shell 和 bash,因为它会 glob 它接收到的任何文件名(如果 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 对象,它可能会产生不良副作用)。

【讨论】:

    【解决方案2】:

    即使非常简短,我仍然认为它值得回答,不仅因为 python 是多平台的,因此当你使用路径时,你应该更喜欢使用

    from os import path
    

    避免在不同平台上运行您的应用程序出现问题

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2015-06-14
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多