-1

次のコードを取得しましたが、出力が得られません。これでpdbを実行したところ、次の結果が得られました。

import tarfile
import sys

def hereweextract(self, *args):
    for i in args:
        try:
            f = tarfile.open(i)
            print("Extracting ", i)
            f.extractall()
            f.close()
        except tarfile.ReadError:
            sys.exit("File not a tarball, or any of .xz/.bz2/.gz archives.")

if __name__ == "__main__":
    hereweextract(sys.argv[1:])

これで pdb を実行したところ、次の結果が得られました。

>>> python ll.py file1.tar.xz file2.tar.xz
> /tmp/kk/ll.py(11)<module>()
-> def hereweextract(self, *args):
(Pdb) n
> /tmp/kk/ll.py(22)<module>()
-> if __name__ == "__main__":
(Pdb) 
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(sys.argv[1:])
(Pdb) 
--Return--
> /tmp/kk/ll.py(23)<module>()->None
-> hereweextract(sys.argv[1:])
(Pdb) 
Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x7f5dc8e596e0> ignored

なぜこれが起こっているのか、コードの何が問題なのかはわかりません。「hereweextract()」関数にさえ到達していません。関数「hereweextract()」に引数を渡す方法について、その何かを理解しています。

ここで何が問題なのか、どうすればこれを修正できるのか、誰でも指摘できますか。

# #

すべての回答に感謝します。

これはクラスの一部でした。それが、hereweextract() が自己を持つ理由です。この機能のトラブルシューティング中に、私はそれを完全に見逃していました。それを指摘してくれてありがとう。

私はそれを削除し、提案された変更を加えました。関数は次のようになります。

import os
import tarfile
import sys

import pdb
pdb.set_trace()


def hereweextract(*args):
    print args
    for i in args:
        try:
        f = tarfile.open(i)
        print("Extracting ", i)
        f.extractall()
        f.close()
    except tarfile.ReadError:
        sys.exit("File not a tarball, or any of .xz/.bz2/.gz archives.")

if __name__ == "__main__":
    hereweextract(*sys.argv[1:])

このコードでは、次の pdb トレースが表示されます。

>>> python ll.py file1.tar.xz file2.tar.xz
> /tmp/kk/ll.py(11)<module>()
-> def hereweextract(*args):
(Pdb) n
> /tmp/kk/ll.py(22)<module>()
-> if __name__ == "__main__":
(Pdb) 
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(*sys.argv[1:])
(Pdb) 
['file1.tar.xz', 'file2.tar.xz']
SystemExit: 'File not a tarball, or any of .xz/.bz2/.gz archives.'
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(*sys.argv[1:])
(Pdb) 
--Return--
> /tmp/kk/ll.py(23)<module>()->None
-> hereweextract(*sys.argv[1:])
(Pdb) 
File not a tarball, or any of .xz/.bz2/.gz archives.

__main__では、リストを返すため、引数を sys.argv[1:] として渡すべきではないことを理解しています。それとも私は間違っていますか?hereweextract() で何を渡す必要がありますか?

4

3 に答える 3

4

ここにはいくつか問題があります。まず、selfクラスのメソッドではない場合、関数の最初の引数として使用しています。これを削除します。プログラムは、あなたが言っているエラーにさえ到達しません。

第 2 に、argv[1:]関数に渡すときは、それを単一の引数として渡します。つまり、抽出するファイルの名前を含むリストです。ただし、関数は複数の引数を受け入れるように記述されており、それぞれが抽出されるファイルの名前です。したがってargs、単一のアイテム、ファイル名のリストが含まれており、繰り返しargs実行すると、個々のファイル名ではなく、ファイル名のリストを開こうとします。ファイル名のリストはファイル名ではないので、開けなくても不思議ではありません。

関数はそのように定義する必要があります。(また、いくつかの名前を改善し、次のファイルに進む代わりに最初のエラーでプログラム全体を停止しないようにするなど、いくつかの他のことを自由にクリーンアップしました。)

def extract_tarfiles(names):
    for name in names:
        try:
            f = tarfile.open(name)
            print("Extracting ", name)
            f.extractall()
        except tarfile.ReadError:
            print("File not a tarball, or any of .xz/.bz2/.gz archives.")
        finally:
            f.close()
于 2013-09-08T20:01:41.623 に答える
2

これを試して:

import tarfile
import sys

def hereweextract(*args):
    for i in args:
        try:
            f = tarfile.open(i)
            print("Extracting ", i)
            f.extractall()
            f.close()
        except tarfile.ReadError:
            sys.exit("File not a tarball, or any of .xz/.bz2/.gz archives.")

if __name__ == "__main__":
    hereweextract(*sys.argv[1:])

あなたのコードでは sys.argv[1:] の内容が self 変数に割り当てられています。

于 2013-09-08T20:01:34.020 に答える
0

selfの定義からパラメータを取り出しますhereweextractsys.argv[1:]2 つの要素 (ファイル名) のリストを引数として self に渡します。その後、*argsタプルは空になります。argsの先頭でyour を印刷してみるhereweextractと、タプルが空であることがわかります。

于 2013-09-08T20:01:54.207 に答える