2016-05-02 5 views
0

Я пытался запустить скрипт python в visual studio 2015, и я хотел указать путь к моей функции arparse, однако продолжал получать OSError. См. Обновление проблемы. Кажется, что разница в том, как argparse получает значения из команды вместо поведения bash.Windows cmd против bash для sys.argv - Python

Могу ли я указать его как этот

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" 

Update Я скопировал сценарий и XML-файл на тест-ди приходской. Отсюда я запустил скрипт на двух разных оболочках на окнах.

По команде 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" 

Когда я изменить его мерзавца Баш Он читает файл я получаю сообщение об ошибке, однако она показывает свою работу.

[email protected] ~/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) 

Update 2 Основываясь на комментарии пытаюсь реализовать Glob, чтобы разрешить использование окна оболочек. 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() 
+1

Похоже, что что-то (пытается) изменить путь, который вы указали, в его [файл URI-схемы] (https://en.wikipedia.org/wiki/File_URI_scheme) эквивалент. Попробуйте использовать что-то вроде '\\ C: \ Users \ Sayth \ Documents \ Racing \ XML \ * xml'. – martineau

+0

Посмотрите на 'sys.argv'; это то, с чем должен работать «argparse». – hpaulj

+0

@martineau это не сработало. Система. argv работает над bash, не уверен, какая разница здесь – sayth

ответ

1

Следующая должен работать как с оболочкой Windows, cmd и Баш, потому что это будет шарик любые имена файлов, которые он получает (что может произойти, если оболочка не сделать это уже):

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

даже очень короткий и простой, я до сих пор считаю его стоит ответа не только комментарий, потому что питон несколько платформ и по этой причине, когда вы работаете с путем вы должны предпочесть использование

from os import path 

, чтобы избежать проблем с запуском вашего приложения на разных платформах

Смежные вопросы