用户输入和命令行参数 [已关闭]

User input and command line arguments [closed]

提问人:Teifion 提问时间:9/16/2008 最后编辑:Travis JTeifion 更新时间:2/6/2023 访问量:1438976

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

4年前关闭。

我如何拥有一个可以接受用户输入的 Python 脚本,如果从命令行运行,我如何使其在参数中读取?

python 输入 命令行参数

评论

9赞 steampowered 10/27/2012
答案将取决于您的 Python 版本。Python 3.x 与 Python 2.7 略有不同
4赞 HelloGoodbye 1/22/2014
Python 2.7 也与 2.7 之前的版本略有不同,例如 而不是。argparseoptparse
3赞 user202729 9/10/2018
如何在 Python 中从 stdin 读取?、如何读取/处理命令行参数?的副本。在元上讨论
0赞 reinierpost 4/25/2022
它实际上与第一个重复:用户输入来自 ,它并不总是与标准输入相同。/dev/tty
0赞 Karl Knechtel 2/5/2023
与@user202729引用的元讨论一致,我已经清理了此处链接为重复的其他问题(在大多数情况下,通过更改它们以链接到其他两个规范之一),并投下了第一个删除票。

答:

516赞 lbz 9/16/2008 #1
var = raw_input("Please enter something: ")
print "you entered", var

或者对于 Python 3:

var = input("Please enter something: ")
print("You entered: " + var)

评论

31赞 Dennis Golomazov 7/2/2014
需要注意的是,您不必导入,它是一个内置功能。raw_input
7赞 Goujon 11/8/2017
您不必在打印串联中使用 str(),因为默认情况下所有输入的数据都将是 str(ing) 类型(偶数)。
0赞 reinierpost 4/13/2022
这效果不佳:它从标准输入中读取,这并不总是 tty。
0赞 tripleee 6/1/2022
@reinierpost 什么意思?当然,还有其他方法可以读取输入,但这在终端中工作正常。某些 IDE 可能会遇到问题,因为它们不允许您与从 stdin 读取内容的进程进行交互,但这更像是这些 IDE 的缺陷。
0赞 reinierpost 6/1/2022
@tripleee:我所有的脚本都是为了将它们的输出写入 stdout,因此我可以将其重定向到文件或管道。当这些脚本向用户提问时,它们必须转到 tty(用户),而不是文件或管道 (stdout)。同样,即使脚本从其他地方读取 stdin,也应该从 tty 读取用户的答案(尽管这种用例非常罕见,以至于我的脚本都不需要进行这种区分)。
35赞 David Webb 9/16/2008 #2

处理命令行参数的最佳方法是 argparse 模块。

用于获取用户输入。如果导入 readline 模块,您的用户将拥有行编辑和历史记录。raw_input()

评论

0赞 demented hedgehog 10/22/2013
Readline 仅在 Unix 上开箱即用。
6赞 Niels Bom 10/14/2014
argparse 是新的 optparse
0赞 tripleee 6/1/2022
很难想象一个句子是“最好”和可以组合在一起的。它是标准的参数解析器,但它既复杂又毛茸茸的,如果你只是想循环,那就太过分了argparsesys.argv[1:]
0赞 Roland 11/18/2022
感谢您推荐 argparse。与我多年前在 C 中使用的参数解析相比,这是一个很大的改进。比我尝试过的任何快速手动编码的东西都要好得多,即使对于只有几个选项的简单命令行,而且 --help 是免费内置的!
613赞 Antti Rasinen 9/16/2008 #3

要读取用户输入,您可以尝试使用 cmd 模块轻松创建迷你命令行解释器(带有帮助文本和自动完成)和 raw_input(Python 3+ 的输入)来读取用户的一行文本。

text = raw_input("prompt")  # Python 2
text = input("prompt")  # Python 3

命令行输入位于 中。在脚本中尝试以下操作:sys.argv

import sys
print (sys.argv)

有两个模块用于解析命令行选项:optparse(自 Python 2.7 起弃用,改用 argparse)和 getopt。如果您只想将文件输入到脚本中,请看 fileinput 的强大功能。

Python 库引用是您的朋友。

评论

73赞 steampowered 12/1/2011
raw_input在 Python 3.x 中重命名为 - 文档在这里input
2赞 Jordan Stewart 4/20/2016
我最喜欢的来源:tutorialspoint.com/python/python_command_line_arguments.htm 这看起来也不错:cyberciti.biz/faq/python-command-line-arguments-argv-example
1赞 Aravind Krishnakumar 2/11/2017
sys.argv 需要提供参数编号,如果假设您将参数作为值传递,例如。python file_name.py 2017-02-10 并且您想使用日期,它应该是 sys.argv[1],否则它将是一个列表,例如 [file_name.py,2017-02-10]
0赞 reinierpost 4/13/2022
如果标准输入来自其他地方,则不会从 tty 读取。这个问题没有明确说明在这种情况下应该发生什么。
13赞 Simon Peverett 9/16/2008 #4

使用“raw_input”从控制台/终端输入。

如果您只想要一个命令行参数,例如文件名或其他东西,例如

$ python my_prog.py file_name.txt

然后你可以使用 sys.argv...

import sys
print sys.argv

sys.argv 是一个列表,其中 0 是程序名称,所以在上面的例子中,sys.argv[1] 将是 “file_name.txt”

如果您想在命令行上拥有完整的选项,请使用 optparse 模块。

佩夫

19赞 Vhaerun 9/16/2008 #5

小心不要使用该功能,除非您知道自己在做什么。与 不同,将接受任何 python 表达式,所以有点像inputraw_inputinputeval

7赞 GreenMatt 8/7/2010 #6

从 Python 3.2 2.7 开始,现在有用于处理命令行参数的 argparse

评论

1赞 Sebastian Blask 4/20/2011
argparse 也被向后移植,可以在 PyPi pypi.python.org/pypi/argparse/1.2.1 上使用
214赞 steampowered 12/1/2011 #7

raw_input在 Python 3.x 中不再可用。但被重命名,所以存在相同的功能。raw_inputinput

input_var = input("Enter something: ")
print ("you entered " + input_var) 

更改文档

评论

24赞 IgorGanapolsky 2/23/2012
在 Python 2.7 中,input() 不会将值转换为字符串。因此,如果您尝试这样做: input_variable1 = input (“输入第一个单词或短语:”),您将收到一个错误: Traceback (last recent call last): return eval(raw_input(prompt)) 文件“<string>”,第 1 行,在 <module 中> NameError:未定义名称“bad”
0赞 Deepak Dubey 5/8/2013
input_var = input (“按'E'和'Enter'退出:”) NameError:未定义名称“e” 我正在使用 Python 2.5。如何,我可以克服这个错误。
0赞 Stefan Gruenwald 2/8/2014
您可以使用 Python 2.7 附带的以下导入来避免回溯通知:import fileinput result=[] for line in fileinput.input(): result.append(line)
0赞 Julian 7/17/2016
以下是更多的历史和基本原理: python.org/dev/peps/pep-3111
10赞 Matt Olan 10/26/2012 #8

如果您运行的是 Python <2.7,则需要 optparse,正如文档所解释的那样,它将创建一个接口,用于运行应用程序时调用的命令行参数。

但是,在 Python ≥2.7 中,optparse 已被弃用,并替换为 argparse,如上所示。文档中的快速示例...

以下代码是一个采用整数列表的 Python 程序 并生成总和或最大值:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
19赞 Viswesn 5/20/2015 #9

这个简单的程序可帮助您了解如何从命令行提供用户输入,并在传递无效参数时显示帮助。

import argparse
import sys

try:
     parser = argparse.ArgumentParser()
     parser.add_argument("square", help="display a square of a given number",
                type=int)
    args = parser.parse_args()

    #print the square of user input from cmd line.
    print args.square**2

    #print all the sys argument passed from cmd line including the program name.
    print sys.argv

    #print the second argument passed from cmd line; Note it starts from ZERO
    print sys.argv[1]
except:
    e = sys.exc_info()[0]
    print e

1) 求 5 的平方根

C:\Users\Desktop>python -i emp.py 5
25
['emp.py', '5']
5

2) 传递除数字以外的无效参数

C:\Users\bgh37516\Desktop>python -i emp.py five
usage: emp.py [-h] square
emp.py: error: argument square: invalid int value: 'five'
<type 'exceptions.SystemExit'>
7赞 CorpseDead 2/18/2017 #10

如果是 3.x 版本,则只需使用:

variantname = input()

例如,您要输入 8:

x = input()
8

x 将等于 8,但它将是一个字符串,除非您以其他方式定义它。

因此,您可以使用 convert 命令,例如:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07
2赞 Mark 6/2/2017 #11

在 Python 2 中:

data = raw_input('Enter something: ')
print data

在 Python 3 中:

data = input('Enter something: ')
print(data)

评论

2赞 tripleee 6/1/2022
这会复制之前的答案,而不会添加任何内容。
2赞 Will Charlton 1/18/2019 #12
import six

if six.PY2:
    input = raw_input

print(input("What's your name? "))

评论

1赞 tripleee 6/1/2022
也许需要强调的是,这是一个用于创建与 Python 2 和 Python 3 兼容的代码的工具。如今,如果您正在编写新代码,您可能不需要它;只需专注于 Python 3。import six
0赞 Will Charlton 6/8/2022
同意!我不记得我上次使用 Python 2 是什么时候了。