如何将命令行参数传递给python shell中的python函数

时间:2018-03-19 13:11:13

标签: python-3.x argparse

请耐心等待,因为我的问题有点双重。但我会非常清楚。

我编写了一个python脚本,我打算使用pip install <package_name>进行安装。

让我们在这个文件夹中说我有以下结构

<package_name>
    __init__.py
    area.py

我在area_of_triangle中有一个函数area.py,它接受​​命令行参数并计算三角形的区域。

以下是area.py

的内容
import argparse
from math import sqrt

def area_of_triangle():
    parser = argparse.ArgumentParser(prog="Area of Triangle")
    parser.add_argument("-v", "--verbose", type=int, help="turn verbosity ON/OFF", choices=[0,1])
    parser.add_argument("-a", "--sideA", type=float, help="side A of triangle")
    parser.add_argument("-b", "--sideB", type=float, help="side B of triangle")
    parser.add_argument("-c", "--sideC", type=float, help="side C of triangle")
    args = parser.parse_args()

    s = (args.sideA + args.sideB + args.sideC)/2
    area_hero = sqrt(s*(s-args.sideA)*(s-args.sideB)*(s-args.sideC))

    if args.verbose==1:
        print("for triangle of sides {:<6f}, {:<6f}, {:<6f}, ".format(args.sideA, args.sideB, args.sideC))
        print("the semi perimeter is {:<6f} while the area is {:<6f}".format(s, area_hero))
    else:
        print("area = {:<6f}".format(area_hero))

if __name__ == "__main__":
    area_of_triangle()

我可以在cmd.exe目录中启动package_name并执行python area.py -a 5 -b 7 -c 10,我会得到该区域的值。

我现在要问的是:如果在open cmd.exe内部,我现在键入python进入python shell本身,无论如何我仍然可以将这些参数传递给函数? 从本质上讲,我希望能够做的是

from package_name import area_of_triangle
area_of_triangle() -a 5 -b 7 -c 10

我试过这个并发现它不会起作用。那么有没有办法完成同等的事情呢?

我希望答案是否定的。在这种情况下(也许我应该在一个单独的问题中,但我只想提供足够好的上下文)如何在package_name期间将path添加到pip install package_name以便用户可以继续运行area_of_triangle() -a 5 -b 7 -c 10。我希望能够完成像mkvirtualenv envname

这样的事情

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

您可以将参数作为参数传递给函数(列表)

def area_of_triangle(arguments):
    ...
    args = parser.parse_args(arguments)
    ...

然后将sys.args传递给函数。

if __name__ == "__main__":
    area_of_triangle(sys.args[1:])

这样你总是可以使用参数列表调用你的函数:

area_of_triangle(["-a", "5", "-b", "7", "-c", "10"])

但正确的方法是坚持单一责任原则。让你的area_of_triangle函数只做它在锡上所说的:计算三角形的面积。使其接受三角形边的3个参数并将参数解析移动到不同的函数。

然后您的代码将是这样的:

def area_of_triangle(a,b,c):
    ...

def parse_parameters(arguments):
    ...
    args = parser.parse_args(arguments)
    return (args.sideA, args.sideB, args.sideC)

if __name__ == "__main__":
    a,b,c = parse_parameters(sys.args[1:])
    area_of_triangle(a,b,c)

这样您就可以独立测试参数解析和面积计算。

答案 1 :(得分:0)

有点脏,但有效:

import sys

from package_name import area_of_triangle

sys.argv = 'x -a 5 -b 7 -c 10'.split()
area_of_triangle()

输出:

area = 16.248077

所有命令行参数都在sys.argv中。第一个是文件名。我用虚拟x代替。