如何在Windows命令行中使用参数运行Python脚本

94
这是我的python hello.py 脚本:
def hello(a,b):
    print "hello and that's your sum:"
    sum=a+b
    print sum
    import sys

if __name__ == "__main__":
    hello(sys.argv[2])

问题在于它无法在Windows命令行提示符中运行,我使用了这个命令:
C:\Python27>hello 1 1

很不幸,它并没有起作用,有人可以帮忙吗?

4
请使用适当的代码格式化。 - thibauts
如果“hello.py”在PATH目录中,并且运行hello 1 1没有传递命令行参数,则.py文件关联已损坏。如果CMD或PowerShell找不到“hello.py”,则.PY不在PATHEXT中。您不应该需要运行python hello.py 1 1。这很烦人,因为它要求使用hello.py的限定路径或首先更改其目录。 - Eryk Sun
7个回答

98
  • import sys语句移出hello函数。
  • 参数应该转换为整数。
  • 包含'的字符串文字应该转义或用"括起来。
  • 您在命令行中使用python hello.py <some-number> <some-number>调用程序了吗?
import sys

def hello(a,b):
    print "hello and that's your sum:", a + b

if __name__ == "__main__":
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    hello(a, b)

4
import 不应该在顶层 - 这不是推荐的做法。应该放在 def hello 之前。 - ElmoVanKielmo
2
在Python 2.7中不建议使用无括号的print语句。你应该尽量考虑与Python 3兼容 ;) - Agostino
@Agostino,print('a', 'b') 在 Python 2.x 中会打印出 ('a', 'b'),而不像 Python 3.x 那样打印出 a b。(除非你在 Python 2.x 中使用 from __future__ import print_function - falsetru
1
通过我提出的解决方案,您不需要从__future__导入任何内容。在Python 2.7中,您可以使用括号与print一起使用。只要打印单个字符串并使用+连接子字符串,就可以获得相同的行为。 - Agostino
@Agostino,没有 intsys.argv [...] 就是字符串。 - falsetru
显示剩余4条评论

32

我在寻找处理参数的信息时发现了这个帖子;这篇易懂指南非常棒:

import argparse

parser = argparse.ArgumentParser(description='Script so useful.')
parser.add_argument("--opt1", type=int, default=1)
parser.add_argument("--opt2")

args = parser.parse_args()

opt1_value = args.opt1
opt2_value = args.opt2

运行如下:

python myScript.py --opt2 = 'hi'

1
谢谢分享这个参考资料,其中很好地总结了py参数的最常见用法。 - seedme

17

以下是所有先前答案的总结:

  • 模块应该在函数外导入。
  • 由于位于if语句内,hello(sys.argv [2])需要缩进。
  • hello有2个参数,因此您需要调用2个参数。
  • 至于从终端调用函数,您需要调用python .py ...

代码应该像这样:

import sys
def hello(a, b):
    print "hello and that's your sum:"
    sum = a+b
    print sum

if __name__== "__main__":
    hello(int(sys.argv[1]), int(sys.argv[2]))

然后使用此命令运行代码:

python hello.py 1 1

15

要从命令行执行您的程序,您需要调用Python解释器,如下所示:

C:\Python27>python hello.py 1 1

如果你的代码位于另一个目录中,你将不得不在你的 PATH 环境变量中设置 Python 二进制路径,以便也能运行它。你可以在这里找到详细的说明。


或者只需在命令行键入Python my_full_path\hello.py 1 1。 - doctorlove
非常感谢,我也尝试过这种方式,定义了环境变量(PATH、path和pathext),但没有成功。 - user2563817
当您更改PATH时,请确保关闭并重新打开您正在使用的控制台。 - thibauts

5

你的缩进有问题,这个方法可以解决:

import sys

def hello(a,b):
    print 'hello and thats your sum:'
    sum=a+b
    print sum

if __name__ == "__main__":
    hello(sys.argv[1], sys.argv[2])

显然,如果你将if __name__语句放在函数内部,那么它只会在运行该函数时被评估。问题是:这个语句的目的是首先运行函数。

非常感谢您提供的代码,它确实起作用了。但我想知道出了什么问题,以及在哪里可以找到更多详细信息。非常感谢。 - user2563817

1
import sys

def hello(a, b):
    print  'hello and that\'s your sum: {0}'.format(a + b)

if __name__ == '__main__':
    hello(int(sys.argv[1]), int(sys.argv[2]))

此外,查看@thibauts关于如何调用Python脚本的答案。

0

代码中有不止几个错误。

  1. 'import sys' 行应该在函数外部,因为函数本身是使用通过sys函数获取的参数进行调用的。
  2. 如果你想要正确的总和,你应该将参数(字符串)转换为浮点数。将sum行更改为 --> sum = float(a) + float(b)。
  3. 由于您没有为任何函数参数定义默认值,因此在调用函数时必须传递两个参数 --> hello(sys.argv[2], sys.argv[2])

    import sys def hello(a,b): print ("hello and that's your sum:") sum=float(a)+float(b) print (sum)

    if __name__ == "__main__": hello(sys.argv[1], sys.argv[2])

另外,使用"C:\Python27>hello 1 1"运行代码看起来很好,但是您必须确保文件位于Python知道的目录之一(PATH环境变量)。因此,请使用完整路径验证代码。 例如:

C:\Python34>python C:\Users\pranayk\Desktop\hello.py 1 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接