0

コマンドラインから呼び出すときに、「-fnameoffile」をプログラムに渡そうとしています。これはPythonサイトのドキュメントから入手しましたが、「-ffilename」または「--file = filename」を渡すと、十分な引数を渡さなかったというエラーがスローされます。私が-hを渡すと、プログラムはそれがどうあるべきかを応答し、私に助けを与えてくれます。何か案は?私が見落としているのは単純なことだと思います。ありとあらゆる助けは素晴らしいです、ありがとう、ジャスティン。

[justin87@el-beasto-loco python]$ python openall.py -f chords.tar 
Usage: openall.py [options] arg

openall.py: error: incorrect number of arguments
[justin87@el-beasto-loco python]$ 


#!/usr/bin/python

import tarfile
import os
import zipfile
from optparse import OptionParser

def check_tar(file):
    if tarfile.is_tarfile(file):
        return True

def open_tar(file):
    try:
        tar = tarfile.open(file)
        tar.extractall()
        tar.close()
    except tarfile.ReadError:
        print "File is somehow invalid or can not be handled by tarfile"
    except tarfile.CompressionError:
        print "Compression method is not supported or data cannot be decoded"
    except tarfile.StreamError:
        print "Is raised for the limitations that are typical for stream-like TarFile objects."
    except tarfile.ExtractError:
        print "Is raised for non-fatal errors when using TarFile.extract(), but only if TarFile.errorlevel== 2."

def check_zip(file):
    if zipfile.is_zipfile(file):
        return True

def open_zip(file):
    try:
        zip = zipfile.ZipFile(file)
        zip.extractall()
        zip.close()
        #open the zip

        print "GOT TO OPENING"
    except zipfile.BadZipfile:
        print "The error raised for bad ZIP files (old name: zipfile.error)."
    except zipfile.LargeZipFile:
        print "The error raised when a ZIP file would require ZIP64 functionality but that has not been enabled."

rules = ((check_tar, open_tar),
         (check_zip, open_zip)
         )

def checkall(file):           
    for checks, extracts in rules:
        if checks(file):
            return extracts(file)

def main():
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
    parser.add_option("-f", "--file", dest="filename",
                      help="read data from FILENAME")

    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.error("incorrect number of arguments")

    file = options.filename
    checkall(file)

if __name__ == '__main__':
    main()
4

4 に答える 4

2

あなたの問題はおそらくif len(args) != 1:です。それは追加の議論を探しています(すなわち、オプションではありません)。そのチェックを外してoptions辞書を見ると、が表示されるはず{'filename': 'blah'}です。

于 2010-01-20T00:24:56.327 に答える
1

引数リストからオプションを解析した後、引数が渡されたことを確認します。これは、-fの引数とは無関係です。この議論を渡していないようです。また、実際にはこの引数を使用しないため、おそらくlen(args)のチェックを削除する必要があります。

于 2010-01-20T00:21:52.200 に答える
1

入力ファイル名はプログラムのオプションではなく、引数です。

def main():
    usage = "Usage: %prog [options] FILE"
    description = "Read data from FILE."
    parser = OptionParser(usage, description=description)

    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.error("incorrect number of arguments")

    file = args[0]
    checkall(file)

オプションには一般的に適切なデフォルトがありますが、引数にはないため、通常は違いがわかります。

于 2010-01-20T00:25:27.683 に答える
0

'add_option()'メソッドの'action'属性を'store'に設定する必要があります。これにより、オプションフラグの直後に引数を格納するようにoptparseオブジェクトに指示されますが、これはデフォルトの動作です。フラグに続く値は、argsではなく'options.filename'に格納されます。私も

if len(args) != 1:

これも問題です。len(args)が1より大きいか小さい場合、同じメッセージが表示されます。

于 2010-01-20T00:30:40.073 に答える