2014-12-22 4 views
2

Попытки получить это запустить в Pyscripter и получает следующее сообщение об ошибке:Python Импорт ARGV ошибки

ValueError: need more than 1 value to unpack 

Я совершенно новый для кодирования с Python и Pyscripter, так что если вы могли бы объяснить, почему ваш ответ работает, то было бы замечательно. Благодаря

from sys import argv 

script, user_name = argv 
prompt = '>' 

print "Hi %s, I'm the %s script." %(user_name, script) 
print "I'd like to ask you a few questions." 
print "Do you like me %s?" %user_name 
likes = raw_input(prompt) 

print "Where do you live %s?" %user_name 
lives = raw_input(prompt) 

print "What kind of computer do you have?" 
computer = raw_input(prompt) 

print """ 
Alright, so you said %r about liking me. 
You live in %r. Not sure where that is. 
And you have a %r computer. Nice. 
""" %(likes, lives, computer) 
+1

Вы можете использовать 'argparse' модуль вместо' sys.argv'. – Air

+1

Как вы запускаете скрипт? Вы должны запустить его с одним аргументом. – Evert

+0

Argparse - намного лучший способ сделать именно то, что вы хотите сделать: https://docs.python.org/2/howto/argparse.html – shuttle87

ответ

3

В этом фрагменте кода: script, user_name = argv, "argv" является командной строки арг. Если это меньше двух аргументов, вы получаете эту ошибку, потому что python не может разложить argv на script и user_name.

Поэтому вы должны либо обработать этот случай с ошибкой, либо предоставить дополнительные аргументы при вызове сценария.

Вы можете воспроизвести эту проблему в интерактивном питона строке следующим образом:

>>> from sys import argv 
>>> argv 
[''] 
>>> a, b = argv 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 
>>> argv_new = ['some', 'argument', 'list',] 
>>> a, b = argv_new 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack 
>>> a, b, c = argv_new 
>>> a 
'some' 
>>> b 
'argument' 
>>> c 
'list' 
0

argv уже list, так что вы не можете распаковать его, как вы пытаетесь сделать здесь, если вы указали неправильный номер аргументы в командной строке. Похоже, это то, что вы здесь сделали, поэтому вы получили ошибку.

Произнесите цель состоит в том, чтобы извлечь сценарий и первый аргумент только вы могли бы сделать это:

from sys import argv 

script = argv[0] 
user_name = argv[1] 

Обратите внимание, что имя скрипта хранится в качестве первого элемента списка, все другие аргументы после этого обнаруживаются после этого. Это будет работать, если у вас есть несколько аргументов командной строки.

Если вы хотите убедиться, что есть только один аргумент, вы можете проверить длину списка argv с помощью len(sys.argv).

from sys import argv 

if len(argv) == 2: 
    script = argv[0] 
    user_name = argv[1] 
else: 
    print("Bad number of arguments supplied on command line") 
    exit() 

Однако если мы тестируем, что у нас есть нужное количество аргументов командной строки, мы можем смело использовать распаковку синтаксис вроде этого:

if len(argv) == 2: 
    script, user_name = argv #works because argv is the correct length 
else: 
    print("Bad number of arguments supplied on command line") 
    exit() 

Более продвинутый способ сделать это бы, однако, использовать Argparse, чтобы вы могли подумать, что когда вам удобнее с Python.

0

Проблема в том, что вы не передаете требуемый аргумент argv. От pydoc SYS:

argv -- command line arguments; argv[0] is the script pathname if known

В соответствии с learnpythonthehardway.org, где этот пример кода из .. При запуске этого, помните, что вы должны дать сценарий ваше имя для аргументов ARGV.

IE:

./ex14.py MyName

Смежные вопросы