2

これを Pyscripter で実行しようとすると、次のエラーが発生します。

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)
4

3 に答える 3

3

このコード スニペットではscript, user_name = argv、" argv" はコマンド ライン引数です。引数が 2 つ未満の場合、python はandargvに分解できないため、そのエラーが発生します。scriptuser_name

したがって、このエラー ケースを処理するか、スクリプトを呼び出すときに追加の引数を指定する必要があります。

次のように、インタラクティブな python プロンプトでこの問題を再現できます。

>>> 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'
于 2014-12-22T19:27:48.330 に答える
0

argvはすでに であるlistため、コマンド ラインで間違った数の引数を指定した場合、ここで実行しようとしているように展開することはできません。これはあなたがここで行ったことであるため、エラーが発生したようです。

あなたの目標は、スクリプトと最初の引数を抽出することであり、あなただけがこれを行うことができるとしましょう:

from sys import argv

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

スクリプトの名前がリストの最初の要素として保存され、その後に他のすべての引数が見つかることに注意してください。これは、複数のコマンド ライン引数がある場合に機能します。

引数が 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 に慣れてきたら、それを検討することをお勧めします。

于 2014-12-22T19:34:05.550 に答える