2013-09-08 16 views
-1

У меня есть следующий код, но я не получаю никакого вывода. Я побежал PDB в этом, и получил следующее:python * args не называется

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()'.

Может ли кто-нибудь указать, что здесь не так, и как я могу это исправить.

# #

Спасибо за ответы на все вопросы.

Это была часть класса, вот почему thisweextract() имел себя. Я полностью пропустил его, устраняя эту проблему. Спасибо всем, что указали это.

Я снял его, сделал предложенные изменения, а функция будет выглядеть так:

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()?

ответ

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:] присваивается самостоятельной переменной.

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() 
0

Выньте self параметр из определения hereweextract. Вы передаете sys.argv[1:], который представляет собой список из двух элементов (ваши имена файлов) в качестве аргумента для себя. Тогда ваш кортеж *args окажется пустым.Попробуйте напечатать args в начале hereweextract, и вы увидите, что кортеж пуст.