请耐心等待,因为我的问题有点双重。但我会非常清楚。
我编写了一个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
感谢您的回答。
答案 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
代替。