2016-05-02 7 views
0

私はvisual studio 2015でpythonスクリプトを実行しようとしていましたが、arparse関数へのパスを指定したいと思いましたが、OSErrorを受け取りました。 「問題を更新する」は、argashがbashの動作ではなくコマンドの値を受け取る方法の違いと思われます。私はコピーされた私はパスがWindowsのcmdとsys.argvのbash - Python

OSError: Error reading file 'C:\\Users\\Sayth\\Documents\\Racing\\XML\\*xml': failed to load external entity "file:/C://Users//Sayth/Documents//Racing//XML//*xml" 

を発見していないことをこの

C:\Users\Sayth\Documents\Racing\XML\*xml 

またはこの

C:\\Users\\Sayth\Documents\\Racing\\XML\\*xml 

のように私はOSErrorのを得るようにそれを指定するかどうか

更新 スクリプトとXMLファイルをテスト・ディ長門ここから私はWindows上の2つの異なるシェルでスクリプトを実行しました。

コマンドで

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の にそれを変更するとそれは私がエラーがしかし、それはその作業を示し得るファイルを読み込みます。私はコメントに基づいて更新2

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) 

シンプルargparse機能を持っている

[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' 

は、Windowsシェルの使用を可能にするためにグロブを実装しようとしています。 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シェルとbashの両方で動作するはずです以下:しかし

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) 

を私はを渡すパースナーに引数を追加することは良い設計選択ではないと考えています(parserオブジェクトが再利用された場合に望ましくない副作用が発生する可能性があるため)。

1

私はまだ答えだけでなく、コメント、それは価値が考慮しても、非常に短いとシンプルなPythonはマルチプラットフォームであり、その理由ので、あなたがパスを操作するとき、あなたはあなたのアプリケーションを実行している問題を回避するために

from os import path 

を使用して好む必要があります別のプラットフォームでは

関連する問題