ChatGPT解决这个技术问题 Extra ChatGPT

如何提示用户输入和读取命令行参数

关闭。这个问题需要更加集中。它目前不接受答案。想改进这个问题?更新问题,使其仅通过编辑此帖子专注于一个问题。 2年前关闭。改进这个问题

我如何拥有一个 Python 脚本,a) 可以接受用户输入以及如何制作它 b) 如果从命令行运行,则读取参数?

答案将取决于您的 Python 版本。 Python 3.x 在这方面与 Python 2.7 略有不同
而且 Python 2.7 的执行方式也与 2.7 之前的版本有所不同,例如 argparse 而不是 optparse
它并不是第一个的真正副本:用户输入来自 /dev/tty,它并不总是与标准输入相同。

P
Palec

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

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 library reference 是您的朋友。


raw_input 在 Python 3.x 中重命名为 input - documentation here
sys.argv 需要提供参数编号,如果假设您将参数作为值传递,例如。 python file_name.py 2017-02-10 并且您想使用日期,它应该是 sys.argv[1] 否则它将是一个列表,例如 [file_name.py,2017-02-10]
如果标准输入来自其他地方,则不会从 tty 读取。这个问题并没有说明在这种情况下应该发生什么。
m
miike3459
var = raw_input("Please enter something: ")
print "you entered", var

或者对于 Python 3:

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

需要注意的是,您不必导入 raw_input,它是一个内置函数。
您不必在打印连接中使用 str(),因为默认情况下所有输入的数据都是 str(ing) 类型(偶数)。
这不能很好地工作:它从标准输入读取,这并不总是一个 tty。
@reinierpost 你是什么意思?当然还有其他读取输入的方法,但这在终端中可以正常工作。某些 IDE 可能会遇到问题,因为它们不允许您与从标准输入读取内容的进程进行交互,但这更多是这些 IDE 的缺陷。
@tripleee:我所有的脚本都是为了将它们的输出写入标准输出,所以我可以将它重定向到文件或管道。当这些脚本向用户提问时,它们必须转到 tty(用户),而不是文件或管道(stdout)。同样,即使脚本正在从其他地方读取标准输入,也应该从 tty 读取用户的答案(尽管这种用例非常罕见,以至于我的脚本都不需要进行这种区分)。
s
steampowered

raw_input 在 Python 3.x 中不再可用。但 raw_input 已重命名为 input,因此存在相同的功能。

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

Documentation of the change


在 Python 2.7 中, input() 不会将值转换为字符串。所以如果你尝试这样做:input_variable1 = input("输入第一个单词或短语:"),你会得到一个错误: Traceback (most recent call last): return eval(raw_input(prompt)) File " ",第 1 行,在 NameError: name 'bad' is not defined
input_var = input ("Press 'E' and 'Enter' to Exit:") NameError: name 'e' is not defined 我使用的是 Python 2.5。如何,我可以克服这个错误。
您可以使用 Python 2.7 附带的以下导入来避免 Traceback 通知:import fileinput result=[] for line in fileinput.input(): result.append(line)
以下是更多的历史和理由:python.org/dev/peps/pep-3111
G
Georg Schölly

处理命令行参数的最佳方法是 argparse module.

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


readline 仅在开箱即用的 unix 上可用。
argparse 是新的 optparse
很难想象一个句子可以将“best”和argparse结合起来。它是标准参数解析器,但如果您只想循环 sys.argv[1:]
f
fread2281

小心不要使用 input 函数,除非您知道自己在做什么。与 raw_input 不同,input 将接受任何 python 表达式,所以它有点像 eval


V
Viswesn

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

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'>

S
Simon Peverett

使用“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 模块。

佩夫


C
Cairnarvon

如果您正在运行 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)

G
GreenMatt

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


argparse 也已向后移植,可在 PyPi pypi.python.org/pypi/argparse/1.2.1 上使用
C
CorpseDead

如果它是 3.x 版本,那么只需使用:

variantname = input()

例如,您要输入 8:

x = input()
8

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

所以你可以使用 convert 命令,比如:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07

P
Palec

在 Python 2 中:

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

在 Python 3 中:

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

这复制了之前的答案而不添加任何内容。
W
Will Charlton
import six

if six.PY2:
    input = raw_input

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

也许强调 import six 是一种用于创建与 Python 2 和 Python 3 兼容的代码的工具。如今,如果您正在编写新代码,您可能不需要它;只关注 Python 3。
同意!我不记得上次使用 Python 2 是什么时候了。