如何修改python脚本,使其从命令行获取参数
我在python脚本中有一个函数和一些参数,但我想更改脚本,以便在从命令行调用它时,可以输入新的参数。我知道我需要使用sys模块,但我以前没有使用过它,所以我遇到了麻烦。这是我想用命令行中r、a、z和e的参数重新创建的原始代码:如何修改python脚本,使其从命令行获取参数,python,arguments,command-line-arguments,sys,Python,Arguments,Command Line Arguments,Sys,我在python脚本中有一个函数和一些参数,但我想更改脚本,以便在从命令行调用它时,可以输入新的参数。我知道我需要使用sys模块,但我以前没有使用过它,所以我遇到了麻烦。这是我想用命令行中r、a、z和e的参数重新创建的原始代码: import scipy as sc import scipy.integrate as integrate def dCR_dt(pops, t=0): R = pops[0] C = pops[1] dRdt = r * R - a *
import scipy as sc
import scipy.integrate as integrate
def dCR_dt(pops, t=0):
R = pops[0]
C = pops[1]
dRdt = r * R - a * R * C
dCdt = -z * C + e * a * R * C
return sc.array([dRdt, dCdt])
r = 1
a = 0.1
z = 1.5
e = 0.75
t = sc.linspace(0, 15, 1000)
R0 = 10
C0 = 5
RC0 = sc.array([R0, C0])
pops, infodict = integrate.odeint(dCR_dt, RC0, t, full_output = True)
到目前为止,我一直在努力做到这一点:
import scipy as sc
import scipy.integrate as integrate
import sys
def main(r, a, z, e):
def dCR_dt(pops, t=0):
R = pops[0]
C = pops[1]
dRdt = r * R - a * R * C
dCdt = -z * C + e * a * R * C
return sc.array([dRdt, dCdt])
t = sc.linspace(0, 15, 1000)
R0 = 10
C0 = 5
RC0 = sc.array([R0, C0])
pops, infodict = integrate.odeint(dCR_dt, RC0, t, full_output = True)
if (__name__ == "__main__"):
status = main(sys.argv)
sys.exit(status)
当我尝试在命令行中使用4个新参数运行它时,会出现以下错误:
回溯(最近一次呼叫最后一次):
文件“practisesys.py”,第31行,在
pops,infodict=integrate.odeint(dCR\u dt,RC0,t,full\u output=True)
NameError:未定义名称“dCR_dt”
我不熟悉编码,想了解更多关于如何使用sys模块修改scipts的信息。非常感谢您的帮助!谢谢,希望大家周末过得愉快:)您的代码中有许多不相关的问题。让我们把重点放在你真正想问的部分
def干管(r、a、z、e):
退货
如果uuu name uuuu==“uuuu main”:#括号是不必要的,而且是不规则的
状态=主(系统argv)
系统退出(状态)
这里有两个问题。首先,sys.argv[0]
包含脚本的名称;因此,您希望使用sys.argv[1://code>仅引用命令行参数。第二,将单个参数传递给需要四个参数的函数。你当然可以说
status=main(sys.argv[1]、sys.argv[2]、sys.argv[3]、sys.argv[4])
但是Python有一个方便的缩写“使用此列表作为参数”:
status=main(*sys.argv[1:]
更重要的是,您应该修改函数,使其不使用任何全局变量
def dCR_dt(pops,t=0,r,a,z,e):
R=持久性有机污染物[0]
C=持久性有机污染物[1]
dRdt=r*r-a*r*C
dCdt=-z*C+e*a*R*C
返回sc.array([dRdt,dCdt])
并可能将其余逻辑移到main
:
def干管(r、a、z、e):
t=sc.linspace(0,15,1000)
R0=10
C0=5
RC0=sc.array([R0,C0])
pops,infodict=integrate.odeint(dCR\u dt,RC0,t,full\u output=True)
我对您的问题域了解不够,无法理解main
应该返回什么。您将该值传递给sys.exit
,因此它应该是一个介于0和255之间的整数,其中0表示成功,其他每一个值表示错误。也许打印结果并简单地返回0会更有意义
(另外,您的函数似乎没有将t
用于任何事情。)未定义的名称问题与问题无关。您还需要将t=…
中的代码放到pops、infodict=…
下的main()
下。即,缩进此代码块。此外,您需要像这样调用main:status=main(*sys.argv)
。如果您的main()
接受数量可变的参数,也会更好。否则,如果不提供四个参数,它将崩溃。说defmain(*args)
。有关更多信息,请参阅。