如何修改python脚本,使其从命令行获取参数

如何修改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 *

我在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 * 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)
。有关更多信息,请参阅。