-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__,我不应该将 args 作为 sys.argv[1:] 传递,因为它返回一个列表。还是我错了?我应该在 hereweextract() 中传递什么?

4

3 回答 3

4

这里有几件事是错误的。首先,self当它不是类中的方法时,您将其用作函数的第一个参数。删除这个;该程序甚至不会遇到您所说的错误。

其次,当您传递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参数hereweextract。您正在传递sys.argv[1:]一个包含两个元素(您的文件名)的列表作为 self 的参数。然后你的*args元组最终是空的。尝试args在开头打印你的hereweextract,你会看到元组是空的。

于 2013-09-08T20:01:54.207 回答